Você está na página 1de 19

katia@cin.ufpe.

br 1
HASHING
Katia Guimares
katia@cin.ufpe.br 2
HASHING
Suponha que voc pudesse criar um array onde
qualquer item pudesse ser localizado atravs de
acesso direto.
Isso seria ideal em aplicaes do tipo Dicionrio,
onde gostaramos de fazer consultas aos elementos
da tabela em tempo constante.
Ex: Tabela de smbolos em compiladores.
katia@cin.ufpe.br 3
O Tamanho de uma tabela HASH
Ex: Se fosse uma tabela de nomes com 32 caracteres
por nome, teramos 26
32
> 16
32
= (2
4
)
32
= 2
128

possveis elementos.
Um problema que como o espao de chaves, ou
seja, o nmero de possveis chaves, muito grande
este array teria que ter um tamanho muito grande.
Haveria tambm o desperdcio de espao, pois a cada
execuo somente uma pequena frao das chaves
estaro de fato presentes.
katia@cin.ufpe.br 4
Para que serve Hashing?
O objetivo de hashing mapear um espao enorme de
chaves em um espao de inteiros relativamente pequeno.
Isso feito atravs de uma funo chamada hash function.
O inteiro gerado pela hash function chamado hash
code e usado para encontrar a localizao do item.
katia@cin.ufpe.br 5
Exemplo de Hashing
Suponha que
1. O espao de chaves so os nmeros inteiros de
quatro dgitos, e
2. Deseja-se traduz-los no conjunto {0, 1, ..., 7}.
Uma hash function poderia ser:
f(x) = (5 x) mod 8.
katia@cin.ufpe.br 6
Exemplo de Hashing
Se o conjunto de dados for constitudo pelos anos:
1055, 1492, 1776, 1812, 1918 e 1945, a hash function
f (x) = (5 x) mod 8 gerar o seguinte mapeamento:
Ex: f (1055) = (5 1055) mod 8 = 5275 mod 8 = 3
Ex: f (2002) = (5 2002) mod 8 = 10010 mod 8 = 2
ndice: 0 1 2 3 4 5 6 7
Chave: 1776 1055 1492 1945 1918
1812
2002
katia@cin.ufpe.br 7
Coliso
No exemplo anterior dizemos que entre as chaves 1492
e 1812 ocorreu uma coliso, isto estas duas chaves
geraram o mesmo hash code, ou seja, foram mapeadas
no mesmo ndice.
ndice: 0 1 2 3 4 5 6 7
Chave: 1776 2002 1055 1492 1945 1918
1812
katia@cin.ufpe.br 8
Resolvendo Colises
O desejvel seria que a funo fosse injetiva,
de forma a evitar colises, mas como isso
muito difcil, h vrios esquemas para trabalhar
a ocorrncia de colises.
H duas grandes classes de abordagens:
1. Closed Address Hashing
(endereamento fechado)
2. Open Address Hashing
(endereamento aberto)
katia@cin.ufpe.br 9
Closed Address Hashing (endereamento fechado)
Closed Address Hashing ou hashing encadeado
a forma mais simples de tratamento de coliso.

Cada entrada H[i] da tabela hash uma lista
ligada, cujos elementos tm hash code i.
Para inserir um elemento na tabela:
1. Compute o seu hash code i, e
2. Insira o elemento na lista ligada H[i].
katia@cin.ufpe.br 10
Closed Address Hashing (endereamento fechado)
Problemas com o comprimento da lista ligada
Embora uma funo hash bem escolhida
promova um bom balanceamento, no se pode
garantir que as listas tero tamanhos prximos.
Seria possvel substituir a lista ligada por
estruturas mais eficientes de busca, como
rvores balanceadas, mas isso no se faz na
prtica.
katia@cin.ufpe.br 11
Open Address Hashing (endereamento aberto)
uma estratgia para guardar todas as chaves
na tabela, mesmo quando ocorre coliso.

H[i] contm uma chave, ao invs de um link.

Tem a vantagem de no usar espao extra.
Em caso de coliso, um novo endereo computado.
Esse processo chamado rehashing.
katia@cin.ufpe.br 12
Rehashing por Linear Probing
A forma mais simples de rehashing
linear probing.

Se o hash code f (K) = i, e alguma outra
chave j ocupa a posio H[i], ento a
prxima posio disponvel na tabela H
ser ocupada pela chave K :
rehash (i) = (i+1) mod h.
katia@cin.ufpe.br 13
Rehashing por Linear Probing
rehash (4) = (4+1) mod 8 = 5
para a chave 1812.
ndice: 0 1 2 3 4 5 6 7
Chave:

Ex: Se o conjunto de dados for constitudo pelos anos:
1055, 1492, 1776, 1812, 1918 e 1945, a hash function
f (x) = (5 x) mod 8, e usando linear probing na coliso.
rehash (5) = (5+1) mod 8 = 6
rehash (6) = (6+1) mod 8 = 7
1055 1492 1776
1812
1812 1918
1945
1945
1945
Para a chave 1945:
katia@cin.ufpe.br 14
Rehashing por Linear Probing
Note que:

1. possvel que uma posio i da tabela
Hash j esteja ocupada com alguma chave
cujo hash code diferente de f (K).

2. Rehashing por linear probing no depende
do valor da chave K.
katia@cin.ufpe.br 15
Rehashing por Linear Probing
Para recuperar uma chave:

1. Compute o valor de f (K) = i.

2. Se H[i] est vazia, ento K no est na tabela.

3. Se H[i] contm alguma chave diferente de K,
ento compute rehash (i) = i
1
= (i + 1) mod h.

4. Se H[i
1
] est vazia, ento K no est na
tabela. Seno, se H[i
1
] contm alguma
chave diferente de K, ento rehash (i
1
), etc ...
katia@cin.ufpe.br 16
Rehashing por Linear Probing
Rehashing por Linear Probing pode trazer
srios problemas de coliso se houver uma
alta taxa de ocupao na tabela Hash.

Para um bom desempenho importante
manter a taxa de ocupao da tabela
prxima a 0,5 (50% do espao).
katia@cin.ufpe.br 17
Rehashing por Double Hashing
Um mtodo mais efetivo de fazer rehashing
por Double Hashing.

Ao invs de fazer os incrementos de 1
invariavelmente, os incrementos so feitos
por um valor d, que depende da chave K.

Ex: d = HashIncr (K)
rehash (j, d) = (j+d) mod h.
katia@cin.ufpe.br 18
Rehashing por Double Hashing
ndice: 0 1 2 3 4 5 6 7
Chave:

1055 1492 1776
1812
1812 1918 1945
Ex: Conjunto de dados: 1055, 1492, 1776, 1812, 1918 e 1945
Hash function f (x) = (5 x) mod 8
Colises resolvidas por double hashing com
HashIncr(K) = (K mod 7) + 1
rehash (4, 7) = (4 + 7) mod 8 = 3
HashIncr (1812) = (1812 mod 7) + 1 = 6 + 1 = 7
f (1812) = (5 1812) mod 8 = (9060 mod 8) = 4
rehash (3, 7) = (3 + 7) mod 8 = 2
katia@cin.ufpe.br 19
Removendo Elementos da Tabela
A remoo uma operao delicada em tabelas Hash.

Usa-se um bit para indicar se a posio est, de fato,
ocupada por um elemento vlido da tabela, ou se o
dado que se encontra naquela entrada no faz parte
da mesma.

Você também pode gostar