Hashing. Estruturas de Dados. Motivação



Documentos relacionados
Tabelas Hash. Jeane Melo

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

Tabela de símbolos: tabelas de espalhamento

Hashing. Rafael Nunes LABSCI-UFMG

Algoritmos de pesquisa. Tabelas de dispersão/hash

Hashing Letícia Rodrigues Bueno

HASHING. Katia Guimarães. 1

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande

Estruturas de Dados. Listas Dinâmicas Duplamente Encadeadas & Variantes. Listas Duplamente Encadeadas

Estrutura de Dados. Unidade VI. -Tabela Hash -Grafos. Prof. Ms. Amilton Souza Martha

Sumário. 5COP096 Teoria da Computação Aula 8 Pesquisa em Memória Primária

Tabelas de Espalhamento

Web site. Objetivos gerais. Introdução. Profa. Patrícia Dockhorn Costa

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

Estruturas de Dados. Árvores Parte II: O TAD Árvore. EDs & Algoritmos. Operações Genéricas: Operações de Consulta: Operações de Acesso:

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Complexidade de Algoritmos

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

Orientação a Objetos

Introdução. A Informação e sua Representação (Parte II) Universidade Federal de Campina Grande. Unidade Acadêmica de Sistemas e Computação

5COP096 TeoriadaComputação

Sistemas Operacionais

Organização e Arquitetura de Computadores I

Orientação a Objetos

Figure 2 - Nós folhas de uma árvore binária representando caracteres ASCII

DAS5102 Fundamentos da Estrutura da Informação

Manutenção de Arquivos

Tabelas Hash. Também conhecido como tabelas de dispersão. Até agora... MoFvação. Exercício

Memória Cache. Prof. Leonardo Barreto Campos 1

ISO/IEC 12207: Gerência de Configuração

Universidade Federal de Alfenas

Sistema de Numeração e Conversão entre Sistemas. Prof. Rômulo Calado Pantaleão Camara. Carga Horária: 60h

Cálculo Numérico Aula 1: Computação numérica. Tipos de Erros. Aritmética de ponto flutuante

ESTRUTURAS DE DADOS II

2. Representação Numérica

Projeto e Análise de Algoritmos Projeto de Algoritmos Tentativa e Erro. Prof. Humberto Brandão humberto@bcc.unifal-mg.edu.br

Árvores Binárias de Busca

Unidade 5: Sistemas de Representação

Fundamentos de Sistemas Operacionais. Sistema de Arquivos. Prof. Edwar Saliba Júnior Março de Unidade Sistemas de Arquivos

Hashing (Tabela de Dispersão)

Análise de complexidade

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Escola Secundária c/3º CEB José Macedo Fragateiro. Curso Profissional de Nível Secundário. Componente Técnica. Disciplina de

Componentes da linguagem C++

Programação de Sistemas

Projeto e Desenvolvimento de Algoritmos

Pesquisa Sequencial e Binária. Introdução à Programação SI2

Computadores de Programação (MAB353)

Análises Geração RI (representação intermediária) Código Intermediário

MC102 Algoritmos e Programação de Computadores 2ª Aula Programa, entrada e saída de dados

4 Avaliação Econômica

Arquitetura de Computadores. Sistemas Operacionais IV

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Árvores B. Hashing. Estrutura de Dados II Jairo Francisco de Souza

Programação Orientada a Objetos Herança Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES SISTEMAS DE NUMERAÇÃO: REPRESENTAÇÃO EM PONTO FLUTUANTE. Prof. Dr. Daniel Caetano

Ficha da Unidade Curricular (UC)

Organização e Arquitetura de Computadores I

Pesquisa em Memória Primária. Prof. Jonas Potros

Capítulo 3. Avaliação de Desempenho. 3.1 Definição de Desempenho

1. NÍVEL CONVENCIONAL DE MÁQUINA (Cont.) 1.3. INSTRUÇÕES Conceitos Básicos

Busca. Pesquisa sequencial

Árvores Binárias de Busca

UNIVERSIDADE DE SÃO PAULO E S C O L A D E A R T E S, C I Ê N C I A S E H U M A N I D A D E

Circuitos Digitais Cap. 5

Estruturas de Armazenamento e Indexação. Rafael Lage Moreira Barbosa

DICIONÁRIOS. template<class K,class T> class Par { public: K chave; T valor; Par():chave(),valor()

PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas

Universidade Federal de Santa Maria Curso de Arquivologia. Disciplina de Banco de Dados Aplicados à Arquivística. Versao 1.

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

Sistemas Operacionais

Introdução. A Informação e sua Representação (Parte III) Universidade Federal de Campina Grande Departamento de Sistemas e Computação

Pesquisa Sequencial e Binária

Prof. Antonio Fundamentos de Sistemas Operacionais UNIP/2015

Complexidade de Algoritmos. Edson Prestes

Sistema de Arquivos. Ambientes Operacionais. Prof. Simão Sirineo Toscani

Sistemas Operacionais

Sobre o Professor Dr. Sylvio Barbon Junior

O que é um programa? Programa é uma lista de instruções que descrevem uma tarefa a ser realizada pelo computador.

Projeto e Análise de Algoritmos Projeto de Algoritmos Introdução. Prof. Humberto Brandão humberto@dcc.ufmg.br

Aula Bibliografia - Definições - Operadores - Criação de um algoritmo - Exercícios. Algoritmo e Programação. Prof. Fábio Nelson.

O processador é composto por: Unidade de controlo - Interpreta as instruções armazenadas; - Dá comandos a todos os elementos do sistema.

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Algoritmos e Programação Conceitos e Estruturas básicas (Variáveis, constantes, tipos de dados)

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

3. O NIVEL DA LINGUAGEM DE MONTAGEM

Notas da Aula 17 - Fundamentos de Sistemas Operacionais

Universidade de São Paulo São Carlos, SP Instituto de Ciências Matemáticas e de Computação. SSC0206 1/2010 Introdução à Compilação

Disciplina: Unidade III: Prof.: Período:

Arquiteturas RISC. (Reduced Instructions Set Computers)

ANÁLISE E IMPLEMENTAÇÃO DE ALGORITMOS DE COMPRESSÃO DE DADOS. Maria Carolina de Souza Santos 1 Orientador: Prof.º Ms.

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária

Introdução à Lógica de Programação

Contagem. Prof. Dr. Leandro Balby Marinho. Matemática Discreta. Fundamentos Inclusão/Exclusão Princípio da Casa dos Pombos Permutações Combinações

Introdução às Linguagens de Programação

4 Segmentação Algoritmo proposto

FACULDADE DE IMPERATRIZ - FACIMP BACHARELADO EM SISTEMAS DE INFORMAÇÃO ESTRUTURA DE DADOS 2. Vieira Lima Junior. Everson Santos Araujo

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES

Transcrição:

Estruturas de Dados Hashing Prof. Ricardo J. G. B. Campello Parte deste material é baseado em adaptações e extensões de slides disponíveis em http://ww3.datastructures.net (Goodrich & Tamassia). Motivação Árvores AVL permitem realizar as operações básicas de busca, inserção e remoção de itens em tempo O(log n), o n é o no. de itens É possível conseguir desempenho melhor??? 1

Hashing Uma abordagem para tentar obter desempenho superior àquele das árvores AVL é conhecida como hashing Essa abordagem utiliza uma estrutura de dados denominada tabela hash Também denominada tabela de dispersão Tabela Hash Uma tabela hash para um dado tipo de chave consiste de: Uma função hash h Um arranjo (tabela) de tamanho N Uma função hash h mapeia chaves de um dado tipo em inteiros em um intervalo fixo [0, N 1] O valor inteiro h(k) [0, N 1] é chamado de valor hash da chave k 2

Tabela Hash Aplicação em Mapas / Dicionários: Item com chave k armazenado no índice i = h(k) da tabela O índice é calculado, não procurado Tabela Hash - Exemplo Tabela hash para um mapa armazenando itens (CPF, Dados Pessoais), onde a chave CPF é um inteiro positivo com 11 dígitos No exemplo ao lado utilizase um arranjo de tamanho N = 10.000 e a seguinte função hash: h(k) = 4 últimos dígitos de k Pode haver conflitos...? 0 1 2 3 4 9997 9998 9999 025.612.000-01 981.101.000-02 451.229.000-04 200.751.799-98 3

Colisões Colisões ocorrem quando diferentes chaves são mapeadas sem distinção na mesma célula da tabela Colisões podem ocorrer tanto na fase de codificação das chaves (h 1 ) como na fase de compressão (h 2 ) Ocorrendo na fase de codificação, não há como serem revertidas na fase de compressão Colisões requerem tratamentos a posteriori que, por sua vez, demandam esforço computacional Funções hash devem ser simples e rápidas de calcular, minimizando ao máximo colisões 0 1 2 3 612-0001 4 229-0004 101-0004 Note que é impossível evitar completamente colisões se o fator de carga (load factor) λ de uma tabela hash for λ>1 Esse fator é definido como a razão entre o no. n de chaves pelo tamanho da tabela N: λ = n/n Funções Hash Uma função hash é composta das seguintes sub-funções: Código Hash (hash code): h 1 : chaves inteiros Função de Compressão: h 2 : inteiros [0, N 1] Usualmente, quando se assume que já se dispõe de uma codificação inteira das chaves, refere-se à função de compressão sozinha como função hash O código hash (quando necessário) é aplicado primeiro; em seguida a função de compressão é aplicada ao resultado: h(k) = h 2 (h 1 (k)) A meta da função hash é dispersar as chaves de forma que essas ocupem a tabela da forma mais uniforme possível 4

Códigos Hash Casting: Interpretação dos bits da chave como um inteiro Por exemplo, para chaves numéricas em ponto flutuante: k = m*10 e Uma alternativa é somar os inteiros correspondentes à mantissa e o expoente do número em representação de ponto flutuante h 1 (k) = m + e Códigos Hash Soma de Componentes: A idéia de somar inteiros correspondentes a partes de uma representação pode ser estendida para qualquer chave k que possa ser representada por uma série k 0, k 1,..., k m 1 de inteiros Em outras palavras: h 1 m ( ) k = 1 k i i= 0 Útil em muitos casos, mas incapaz de distinguir chaves distintas que diferem entre si apenas pela ordem das componentes k i Esse é o caso de chaves tipo string, representadas como séries de inteiros dados pelos códigos ASCII de cada um dos seus caracteres (ou pela ordem alfabética do caractere) 5

Códigos Hash Acumulação Polinomial: Ao invés de uma soma simples, utiliza-se o seguinte polinômio: h 1 (k) = k 0 + k 1 a + k 2 a 2 + + k m 1 a m 1 para um valor fixo de a Funciona bem, em especial para strings p. ex. as escolhas empíricas a = 33, 37, 39 ou 41 geram em torno de apenas 6 colisões para 50.000 palavras em Inglês! Muitas vezes basta tomar apenas um subconjunto dos m (p. ex. 10) primeiros / últimos caracteres da string Códigos Hash Acumulação Polinomial (Nota): h 1 (k) = k 0 + k 1 a + k 2 a 2 + + k m 1 a m 1 Esse polinômio pode ser avaliado em tempo O(m) utilizando a Regra de Horner: Os seguintes polinômios são calculados recursivamente em tempo O(1): p 0 (k) = k m 1 p i (x) = k m i 1 + ap i 1 (k) i = 1, 2,, m 1 Tem-se h 1 (k) = p m 1 (k) 6

Funções de Compressão Resto da Divisão: h 2 (y) = y mod N Exemplo: Códigos hash: y = [200, 205, 210, 215,..., 595, 600] Para N = 101, tem-se: h 2 (y) = [99, 3, 8, 13,..., 90, 95] pois os múltiplos de 101 são 101, 202, 303, 404, 505,... Note que não ocorre qualquer colisão nesse caso Nota: O módulo. permite lidar com códigos hash negativos... mas faz com que esses conflitem com suas contrapartidas positivas... Funções de Compressão Resto da Divisão (cont.): O tamanho N da tabela é usualmente escolhido primo A razão formal está relacionada com a teoria dos números Informalmente, tem-se que padrões do tipo y = pn+q para q inteiro positivo e p = 0,1,2,... são menos comuns em códigos hash para N primo Note que qualquer código hash seguindo este padrão possui o mesmo valor h 2 (y)! Exemplo: y = [200, 205, 210, 215,..., 595, 600] Para N = 101, já vimos que não ocorre qualquer colisão Já para N = 100, cada código terá o mesmo valor hash de ao menos outros 3 códigos! 7

Funções de Compressão Resto da Divisão (cont.): Heurística: Estimar a quantidade de chaves n e definir N como o no. primo que mais aproxima o fator de carga λ = n/n desejado Exemplo: n = 2000 chaves e fator de carga desejado λ = 3 escolhe-se N = 701 como no. primo mais próximo de 2000/3 Funções de Compressão Existem outras funções de compressão: Multiplicação-Divisão Multiply, Add and Divide (MAD) Funções Universais De formas distintas, essas funções buscam reduzir a sensibilidade à escolha de N e/ou minimizar a probabilidade de colisões. 8

Tratamento de Colisões Colisões ocorrem quando dois itens são mapeados na mesma célula da tabela Um método simples e eficiente de lidar com colisões que não podem ser evitadas é conhecido como encadeamento externo 0 1 2 3 025-612-0001 4 451-229-0004 981-101-0004 ou separate chaining Nesse método, cada célula da tabela aponta (ponteiro) para uma lista dos itens mapeados naquela célula O tempo adicional para percorrer essas listas e o espaço extra para armazená-las são as razões pelas quais colisões devem ser evitadas ao máximo Rehashing: Em aplicações dinâmicas, quando o número de colisões aumenta muito em função do fator λ = n/n, pode-se criar uma nova tabela e re-dispersar as chaves Performance Hipótese: função hash eficiente, que distribua de maneira uniforme as chaves, ou seja, distribuição de probabilidade de atribuição de chaves é uniforme sobre o conjunto de células da tabela O tamanho médio (esperado) das listas para separate chaining é O(n/N) Logo, fazendo o tamanho da tabela ser proporcional ao número de chaves, ou seja, N O(n), faz-se o tamanho médio das listas para separate chaining ser O(1) Pode-se fazer isso estimando de antemão o no. típico de chaves que estarão usualmente armazenadas na tabela ou via rehashing... 9

Performance (cont.) Nesse caso, todas as operações (busca, inserção e remoção) executam na média em tempo constante assumindo que a função hash e as operações de remoção e inserção nas listas também executam em tempo cte. No pior caso, quando todas as chaves são mapeadas em uma mesma célula, recai-se essencialmente na implementação baseada em lista, com busca e remoção em O(n) Porque inserção é O(1) mesmo nesse pior caso...? Comparação com AVL Tabela Hash Busca O(1) esperado Inserção Remoção Notas O(1) O(1) esperado O(n) no pior caso para busca e remoção implementação simples Árvores AVL O(log n) pior caso O(log n) pior caso O(log n) pior caso implementação complexa 10

Variantes e Casos Particulares Endereçamento aberto: Denominada open addressing em inglês, é uma estratégia de tratamento de colisões na qual um item em colisão é alocado a uma outra célula disponível da tabela Trata-se de uma abordagem voltada a aplicações onde se tem restrições severas de memória, que podem ser minimizadas ao preço de um maior esforço de processamento A idéia é, em caso de conflito ao tentar inserir um novo item, percorrer (sondar) a tabela buscando por uma célula não ocupada Diferentes estratégias de sondagem: linear, quadrática, hashing duplo... Estratégias específicas também para busca e remoção de elementos O fator de carga nunca pode exceder 1 pois cada célula da tabela armazena um único item Variantes e Casos Particulares Endereçamento direto: Denominado direct addressing em inglês, trata-se de um caso muito particular de hashing onde as chaves são naturalmente inteiros em {0, 1,..., N 1} Nesse caso, a função hash é dispensável, não há colisões se chaves forem únicas e todas as operações são O(1) O problema é que, como não se pode reduzir N pois os valores das chaves estão naturalmente entre 0 e N 1, perde-se o controle sobre o fator de carga Nesse caso, se o no. de chaves é tal que n << N, o endereçamento direto implica uma perda de espaço pela alocação de uma tabela de tamanho muito superior ao necessário 11

Variantes e Casos Particulares Hashing Perfeito: Em aplicações muito particulares onde o conjunto de chaves é estático e conhecido a priori, pode-se projetar um hashing perfeito por exemplo, conjunto de palavras reservadas de uma linguagem de programação (aplicação em compiladores) Esse tipo de hashing executa todas as operações de busca, inserção e remoção em tempo O(1) no Pior Caso Exercícios Sugeridos Capítulo 8 (Goodrich & Tamassia, 2002) Capítulo 8 (Szwarcfiter & Markenzon, 1994) Capítulo 5 (Ziviani, 2004) 24 12

Bibliografia M. T. Goodrich & R. Tamassia, Data Structures and Algorithms in C++/Java, John Wiley & Sons, 2002/2005 M. T. Goodrich & R. Tamassia, Estruturas de Dados e Algoritmos em Java, Bookman, 2002 J. L. Szwarcfiter & L. Markenzon, Estruturas de Dados e seus Algoritmos, LTC, 1994 N. Ziviani, Projeto de Algoritmos, Thomson, 2a. Edição, 2004 T. H. Cormen et al., Introduction to Algorithms, MIT Press, 2 nd Edition, 2001 25 13