Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Introdução
2. Funções de Hashing
Uma função de hashing ideal deve ser facilmente computada e deve transformar os valores
das chaves em índices uniformemente distribuídos, aparentemente aletórios, para diminuir o número
de colisões. Para uma tabela de tamanho M, a função de hashing h(K) deve gerar índices dentro do
intervalo [0, M-1]. Qualquer função que contemple estes requisitos pode ser utilizada como função
de hashing, todavia as funções mais utilizadas são as baseadas no método da divisão e da
multiplicação.
UFGD / FCET — Prof. Wellington Lima dos Santos — Algoritmos e Estruturas de Dados II.
2.1 Método da Divisão
É simples e eficiente tanto no que diz respeito à rapidez (aritmética de inteiros) como no
espalhamento dos registros, conforme a escolha do tamanho tabela. Consiste em dividir o valor da
chave K pelo tamanho M da tabela, tomando-se como índice do registro o resto desta divisão:
h(K) = K mod M
Chaves de outros tipos de dados como strings, por exemplo, podem ser facilmente
transformadas em números inteiros, uma vez que toda informação é representada no computador
como uma seqüência de bits, que pode ser interpretada como a representação binária de um inteiro.
Para que haja uma distribuição mais uniforme dos registros e menor incidência de colisões, M
não deve ser uma potência de 2, tampouco um número par. Mais que isso, é recomendável que M
seja um número primo, não próximo de uma potência de 2.
Exemplo 1: Determinar os índices dos registros com chaves iguais a [33 44 63 66 84 93] para uma
tabela hash de tamanho 7.
K h(K) = K mod 7
33 5
44 2*
63 0**
66 3
84 0**
93 2*
h(K) = (K A mod 1) M
5 −1
em que 0 < A < 1. Usualmente considera-se A= = 0.618033988749894848...
2
Exemplo 2: Determinar os índices dos registros com chaves iguais a [33 44 63 66 84 93] para uma
tabela hash de tamanho 7.
K h(K) = (K 0,618 mod 1) 7
33 2
44 1
63 6*
66 5
84 6*
93 3
UFGD / FCET — Prof. Wellington Lima dos Santos — Algoritmos e Estruturas de Dados II.
Agora os registros de chaves 63 e 84 colidiram no índice 6 da tabela. A principal vantagem
deste método é que não há restrição quanto à escolha de M.
α)
3. Fator de Carga (α
É a razão entre o número de registros e o tamanho da tabela: α = N / M. Quanto menor o fator
de carga mais posições livres a tabela terá e menor será probabilidade de duas ou mais chaves
distintas serem indexadas como o mesmo índice ou posição da tabela.
4. Tratamento de Colisões
Por melhor que seja a função de hashing e por menor que seja o fator de carga sempre há a
probabilidade de ocorrência de colisões, que são inerentes à técnica e, portanto, devem ser tratadas
de algum modo. Basicamente existem dois métodos para o tratamento de colisões: encadeamento e
endereçamento aberto.
4.1 Encadeamento
Consiste em criar não uma tabela de registros, mas uma tabela contendo M listas
encadeadas (L1, L2, ..., LM) inicialmente vazias, ou apontando para nulo. Para armazenar um registro
de chave K, acessa-se a lista encadeada Lp, na posição p = h(K). Se Lp estiver vazia, aloca-se
memória para o primeiro nodo de Lp, dentro do qual o registro será armazenado. Se Lp não estiver
vazia e a chave K não for localizada em Lp, através de uma pesquisa seqüencial “barata”, significa
que houve uma colisão e um novo nodo será alocado e adicionado à Lp, para armazenar o registro.
Cada lista encadeada terá em média α = N / M registros, sendo possível α > 1.
Exemplo 3: Armazenar seqüencialmente os registros com chaves [33 44 63 66 84 93] numa tabela
hash de tamanho 7, com tratamento de colisões por encadeamento.
0 63 84
K h(K) = K mod 7 1
33 5 2 44 93
44 2
63 0 3 66
66 3
4
84 0
93 2 5 33
6
UFGD / FCET — Prof. Wellington Lima dos Santos — Algoritmos e Estruturas de Dados II.
Conforme a escolha de f(i) tem-se:
Por procurar endereços alternativos adjacentes, este método tende a produzir seqüências de
registros aglomerados (clustering) na tabela, tornando a pesquisa um pouco mais “onerosa”.
Exemplo 4: Armazenar seqüencialmente os registros com chaves [33 44 63 66 84 93] numa tabela
hash de tamanho 7, com tratamento de colisões endereçamento aberto com teste linear.
Exemplo 4: Armazenar seqüencialmente os registros com chaves [33 44 63 66 84 93] numa tabela
hash de tamanho 7, com tratamento de colisões endereçamento aberto com teste
quadrático.
UFGD / FCET — Prof. Wellington Lima dos Santos — Algoritmos e Estruturas de Dados II.