You are on page 1of 7

HASHING HASHING

Árvores de Busca:
Notas de aula da disciplina IME 04-10820 Atualização/Busca - caso médio: O(log n)
Estruturas de Dados I Atualização/Busca - pior caso: O(log n)

Paulo Eustáquio Duarte Pinto


(pauloedp arroba ime.uerj.br) Pergunta: Pode-se melhorar os dados anteriores?

Resposta: Pode-se melhorar o primeiro, ao custo


de piorar o segundo.
dezembro/2008

HASHING HASHING
Pergunta: Como tentar buscar mais rapidamente? Função hash - h(k): U → V.
Resposta: usando-se um vetor e fazendo a trans- Pergunta: h(k) pode ser uma função injetora?
formação chave/endereço, para locali- Resposta: quase nunca...(pensar no paradoxo do
zar a chave no vetor. aniversário...)
Esquema:
V V
U = conjunto de U = conjunto de
U 1 chaves de interesse U 1
h(k) h(k) chaves de interesse

... V = vetor[1..M] ... V = vetor[1..M]


k k
h(k) = Função hash, h(k) = Função hash,
transforma chave k transforma chave
M em endereço em V M em endereço em V

HASHING HASHING - Função hash - Propriedades

Função hash - h(k): U → V - Sinônimos 1) Cálculo rápido.

Já que é tão difícil funções injetoras, tem-se que 2) Gerar endereços na faixa 1..M (0..M-1)
conviver com sinônimos. 3) Gerar distribuição uniforme de sinônimos
V
U 1 U = conjunto de 4) Não preservar propriedades das chaves
h(k) chaves de interesse
V
... V = vetor[1..M]
k1 U 1 U = conjunto de
h(k) chaves de interesse
k2 h(k) = Função hash,
transforma chave V = vetor[1..M]
k1 e k2 são sinônimos M em endereço em V k1 ...
k2 h(k) = Função hash,
To hash = bagunçar, picar mas... k1 e k2 são sinônimos
transforma chave
M em endereço em V

1
HASHING - Função hash HASHING - Função hash
V V
U 1 U 1
h(k) h(k)

a) Resto da Divisão: k1 ... b) Ou Exclusivo: k1 ...


k2 k2
h(k) = k mod M + 1. h(k) = ka + kb + 1.
M M
a.1) cálculo rápido b.1) cálculo rápido
a.2) gera endereços na faixa 1..M
b.2) gera endereços na faixa 1..M=2p
a.3) gera distribuição uniforme de sinônimos
(é periódica com período M) 0..1
b.3) gera distribuição uniforme de sinônimos
1..2
M-1..M Exemplo
M..1 ...
a.4) preserva sequência(!?) b.4) não preserva sequência(!?)

HASHING - Função hash HASHING - Função hash


V
c) Função de Multiplicação:
U 1
h(k) = (k.b mod R) mod M + 1. h(k)
d) Outras Funções
c.1) cálculo rápido hash
k1 ...
c.2) gera endereços na faixa 1..M k2
c.3) pode gerar distribuição uniforme de sinônimos.
Depende de R, b, M. M
1 171 d.1) Dobradura
R = 2 16, M = 613, b = 31415821 2 341
3 566
4 123 d.2) Seleção de partes da chave
5 293
6 518
7 75 d.3) Metade do quadrado
8 245
9 440 d.4) Segredos industriais...
c.4) não preserva sequência. 10 27

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


V 1) Encadeamento Exterior
U 1
h(k) Idéia: criar uma lista encadeada de sinônimos para cada
endereço do vetor.
k1 ...
MÉTODOS 1
k2 k h(k)
2 RE
DO 5
M 3
1) Encadeamento Exterior RE 2
4
MI 6
5 DO
2) Encadeamento Interior (Listas coligadas) FA 5
6 MI
SOL 5
3) Endereçamento aberto 7
LA 2
8
4) Endereçamento aberto com duplo hashing SI 9
9

2
HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos
1) Encadeamento Exterior 1) Encadeamento Exterior
Idéia: criar uma lista encadeada de sinônimos para cada Idéia: criar uma lista encadeada de sinônimos para cada
endereço do vetor. endereço do vetor.

1 1
k h(k) k h(k)
2 RE 2 RE
DO 5 DO 5
3 3
RE 2 RE 2
4 4
MI 6 MI 6
5 FA DO 5 SOL FA DO
FA 5 FA 5
6 MI 6 MI
SOL 5 SOL 5
7 7
LA 2 LA 2
8 8
SI 9 SI 9
9 9

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


1) Encadeamento Exterior 1) Encadeamento Exterior
Idéia: criar uma lista encadeada de sinônimos para cada
Busca(k, i, p):
endereço do vetor.
p ← V[i];
Enquanto (p ≠ Nulo) e (p↑
↑.c ≠ k):
1 p ← p↑↑.prox;
1
k h(k)
2 LA RE Fe; 2 LA RE
DO 5 Fim.
3 3
RE 2
4 4
MI 6 Inserção(k, p):
5 SOL FA DO 5 SOL FA DO
FA 5 i ← h(k); Busca(k, i, p);
6 MI Se (p = Nulo) Então: 6 MI
SOL 5 Alocar(p); ↑.c ← k;
p↑
7 7
LA 2 ↑.prox ← V[i];
p↑
8 V[i] ← p; 8
SI 9 Senão p ← Nulo;
9 SI 9 SI
Fim.

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


1) Encadeamento Exterior - Análise 1) Encadeamento Exterior - Análise

Melhor caso médio: NC = 1 1 Melhor caso médio: NC = 1 1


2 2
3 Pior caso médio: NC = N 3
4 4
5 5
6 6
.. .. ..
.. ..
M M

3
HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos
1) Encadeamento Exterior - Análise da Busca 2) Encadeamento Interior (listas coligadas)
Idéia: criar listas encadeadas de sinônimos para cada
Melhor caso médio: NC = 1 1 endereço do vetor, no próprio vetor.
2
1
Pior caso médio: NC = N 3 k h(k)
2 RE 7
4 DO 5
3
α/2) 5
Caso médio (média):NC = N(1+α RE 2
α = N/M = fator de carga 4 SI 0
6 ... MI 6
5 DO 9
NC .. FA 5
6 MI 0
1.5 .. SOL 5
7 LA 0
1 M LA 2
8 SOL 4
SI 9
0 α 1
9 FA 8

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


2) Encadeamento Interior (listas coligadas) 2) Encadeamento Interior - Análise
Busca(k, ant, p):
p ← h(k); ant ← p;
Enquanto (V[p].prox ≠ Nulo) e (V[p].c ≠ k):
ant ← p; p ← V[p].prox;
Melhor caso médio: NC = 1
1 1
Fe;
Se (V[p].c ≠ k) Então p ← Nulo; 2 RE 7 2 ka 0
Fim. 3 3
Inserção(k, p):
Busca(k, ant, p);
4 SI 0 4
Se (p = Nulo) e (n < M) Então: 5 DO 9 5 kb
Se (V[ant].c = ‘ ‘) Então
6 MI 0 ..
p ← ant; V[p].c ← k;
Senão 7 LA 0 ..
j ← Next(ant); V[j].c ← k; 8 ..
V[ant].prox ← j; p ← j; SOL 4 0
n ← n+1; 9 FA 8 M kn 0
Senão p ← Nulo;
Fim.

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


2) Encadeamento Interior - Análise 2) Encadeamento Exterior - Análise da Busca

Melhor caso médio: NC = 1 Melhor caso médio: NC = 1


1 km 0 1 km 0
2 Km-1 1 2 Km-1 1
Pior caso médio: NC = N Pior caso médio: NC = N
3 3
4 k1 M 4 k1 M
Caso médio (média):NC = N(1+.8αα)
5 kb α = N/M = fator de carga 5 kb
.. ..
NC
.. ..
.. 1.8 ..
M-2 0
1
M k2 M-1 M k2 M-1
0 α 1

4
HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos
3) Endereçamento Aberto
Exercício: Criar as tabelas hashing para Idéia: usar apenas um vetor, sem links e colocar sinô-
Encadeamento Interior/Exterior, usando como nimos em outra posição. Uma das formas é procurar, cir-
entrada o cularmente, a próxima posição disponível.
MIXSTRING, 1 SI
M = 9 e k h(k)
2 RE
h(letra) = Pos(letra) Mod 9 + 1. DO 5 NC =
3
RE 2 (1+1+1+3+4+2+2)/7=
4 14/7
Calcular NC para cada tabela. MI 6
5 DO
FA 5
6 MI
SOL 5
7 FA
LA 8
8 SOL
SI 9
9 LA

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


3) Endereçamento aberto 3) Endereçamento aberto - Análise

Busca(k, ant, p):


p ← h(k); ant ← p; 1 SI
Melhor caso médio: NC = 1 1
Enquanto (V[p] ≠ Nulo) e (V[p] ≠ k):
ant ← p; p ← p mod M + 1; 2 RE 2 ka
Fe; 3 3
Se (V[p] = Nulo) Então p ← Nulo;
Fim.
4 4
5 DO ..
Inserção(k, p): 6 MI .. kb
Busca(k, ant, p); 7 ..
FA
Se (p = Nulo) e (n < M-1) Então:
V[ant] ← k; p ← ant; 8 SOL .. kn
Senão p ← Nulo; 9 M
LA
Fim.

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


3) Endereçamento aberto - Análise 3) Endereçamento aberto - Análise

Melhor caso médio: NC = 1 1 Melhor caso médio: NC = 1 1


2 ka 2 ka
Pior caso médio: NC = N 3 Pior caso médio: NC = N 3
kb kb
4 4
Caso médio (média):NC = 4 p/ α =.75
.. ..
α = N/M = fator de carga
.. 4 ..
.. NC ..
.. kn .. kn
M 1 M

0 α .75 1

5
HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos
4) Endereçamento Aberto com duplo hash 4) Endereçamento aberto com duplo hashing
Idéia: usar uma segunda função para determinar os
Busca(k, ant, p):
saltos na busca de espaço.
p ← h1(k); ant ← p; s ← h2(k); 1 SI
Enquanto (V[p] ≠ Nulo) e (V[p] ≠ k):
1 ant ← p; p ← (p+s-1) mod M + 1; 2 RE
k h1(k) h2(k) Fe; 3
2 RE
DO 5 1 Se (V[p] = Nulo) Então p ← Nulo;
3 NC =
Fim.
4
RE 2 2 (1+1+1+2+2+1+2)/7=
5 DO
4 SI 10/7
MI 6 8 Inserção(k, p): 6
5 DO MI
FA 5 2 Busca(k, ant, p); 7
6 MI FA
SOL 5 4 Se (p = Nulo) e (n < M-1) Então:
7 FA V[ant] ← k; p ← ant; 8 SOL
LA 8 8 Senão p ← Nulo; 9
8 LA Fim.
LA
SI 9 4
9 SOL

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


4) Endereçamento Aberto com duplo hash 4) Endereçamento Aberto com duplo hash

Requisito importante para h2(k): Requisito importante para h2(k): gerar números
relativamente primos a M!!
1 1
k h1(k) h2(k) k h1(k) h2(k)
2 RE 2 RE
DO 5 1 DO 5 1
3 3 Exemplos:
RE 2 2 RE 2 2
4 4
MI 6 8 MI 6 8 a) M ímpar e
5 DO 5 DO h2(k) = 2 k mod M
FA 5 2 FA 5 2
6 MI 6 MI
SOL 5 4 SOL 5 4
7 FA 7 FA b) M primo e
LA 8 8 LA 8 8
8 LA 8 LA h2(k) = k mod M-1 + 1
SI 8 3 SI 8 6
9 SOL 9 SOL

HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos


4) Endereçamento aberto com duplo hash - Análise 4) Endereçamento aberto com duplo hash - Análise

Melhor caso médio: NC = 1 1 Melhor caso médio: NC = 1 1


2 ka 2 ka
3 Pior caso médio: NC = N 3 kb
4 4
.. ..
.. kb ..
.. ..
.. kn .. kn
M M

6
HASHING - Tratamento de sinônimos HASHING - Tratamento de sinônimos
4) Endereçamento aberto com duplo hash - Análise
Exercício: Criar as tabelas hashing para
Endereçamento aberto simples e com duplo hash,
Melhor caso médio: NC = 1 1 usando como entrada o
2 ka MIXSTRING,
Pior caso médio: NC = N 3 kb M = 9 e
4 h(letra) = Pos(letra) Mod 9 + 1.
Caso médio (média):NC = 3 p/ α =.75
..
α = N/M = fator de carga
3 .. Calcular NC para cada tabela.
NC ..
.. kn
1 M

0 α .75 1

HASHING

Fim