Beruflich Dokumente
Kultur Dokumente
ESTRUTURAS DE DADOS E
ALGORITMOS
TABELA HASH
1 Adalberto Cajueiro
Departamento de Sistemas e Computao
Universidade Federal de Campina Grande
1
01/03/2013
PROBLEMA
Cenrio:
Suponha que desejamos ter insero, remoo,
pesquisa em O(1) para um sistema que gerencie os N
discentes e docentes do DSC/UFCG? Assuma que
cada pessoa possui um nmero identificador nico no
intervalo [1..N].
Que estrutura de dados vocs escolheriam?
2
01/03/2013
Criar Array A /
h(k) = k key=2
A[0..m-1] Joo
/
A[k] = x, 3 2
se k = key[x] 4 /
5 key=5
ou A[k] = null 0 8 Maria
9 /
1 6 Chaves (K) /
7 /
key=9
6
Leila
3
01/03/2013
Direct-Address-Search(T, k)
return T[k]
Direct-Address-Insert(T, x)
T[key[x]] x
Direct-Address-Delete(T, x)
T[key[x]] NIL
7
4
01/03/2013
TABELAS HASH
Tambm conhecidas com o tabelas de disperso
Resolve o problema quando |U| > length(T)
mantendo o tempo de acesso em O(1) em mdia?
Nao usa a identidade para mapear chaves em
indices mas uma funcao de hashing.
h : U {0,..., m 1}
TABELA HASH
Exemplo de coliso
h(k )
10
5
01/03/2013
CARACTERSTICAS
No precisamos ocupar |U| posies na tabela
Ocupamos menos espao do que com a tabela de
acesso direto
Espaco: O(|K|), onde K o conjunto de chaves
guardadas
D para conseguir acesso com tempo O(1) na mdia
O elemento com chave k guardado na posio
h(k) da tabela
h a funo hash
h tem que ser determinstica
11
EXEMPLO
Seja h(k)=k%10 uma funo hash que mapeia de
chaves do universo K em {2,5,9,100,107}.
Considere uma tabela com m=10 clulas.
/
Universo de
Chaves (U) /
2
...
/
K 2
/
5 5
9 ...
/
/
/ 12
9
...
6
01/03/2013
EXEMPLO
O que acontece se utilizarmos a funo hash
h(k)=k%10 para inserir os elementos {2,5,9,12}?
/
Universo de
Chaves (U) /
2
...
2 /
12 /
5 5
9 ...
/
/
13
/
9
...
COLISES
Tabela hash ideal seria aquela sem coliso
Impossvel quando |U| > m (tamanho da tabela)
Existem mais chaves que posies
Duas ou mais chaves so mapeadas em um mesmo
ndice
Escolher uma boa funo hash para minimizar as
colises
14
7
01/03/2013
15
16
8
01/03/2013
EXERCCIO
Implemente as operaes (inserir, remover,
pesquisar) utilizando a resoluo de conflitos by
chaining?
Inserir(T,x)
Remover(T,x)
Pesquisar(T,k)
17
EXERCCIO
Implemente as operaes (inserir, remover,
pesquisar) utilizando a resoluo de conflitos by
chaining?
Inserir(T,x)
Inserir x na cabea de T[h(key(x))];
Remover(T,x)
Deletar x da lista T[h(key(x))];
Pesquisar(T,k)
Buscar x na lista T[h(k)];
18
9
01/03/2013
EXERCCIO
Implemente as operaes (inserir, remover,
pesquisar) utilizando a resoluo de conflitos by
chaining?
Inserir(T,x)
Inserir x na cabea de T[h(key(x))];
Remover(T,x)
Deletar x da lista T[h(key(x))];
Pesquisar(T,k)
Buscar x na lista T[h(k)];
19
EXERCCIO
Qual seria a tabela final considerando
endereamento fechado (resoluo por chaining) e
funo de hash h(k)=k%2 e chaves do universo
K={2,4,6,8}?
20
10
01/03/2013
EXERCCIO
Qual seria a tabela final considerando
endereamento fechado (resoluo por chaining) e
funo de hash h(k)=k%2 e chaves do universo
K={2,4,6,8}?
2
8 6 4 2
4
... ... ... ...
8 /
6
21
FATOR DE CARGA
A funo h faz um hashing uniforme simples
Chaves possuem igual probabilidade de serem
mapeadas para qualquer um dos indices
Cada clula da tabela vai ter um nmero mais ou
menos igual de elementos
Origina a noo de load factor (fator de carga)
(numero medio de elementos em cada lista)
n = nmero de chaves
m = nmero de clulas na tabela
= n/m
Exemplo: qual o fator de carga de uma tabela
22
hash com 50 clulas e 100 chaves?
11
01/03/2013
EXERCCIO
Qual o limite assintoticamente restrito usando o
fator de carga () para uma pesquisa?
...
h(ki) h(kj) h(kn)
i ...
... ... ...
...
T (1+ )
23
Aplicar a
funo hash
EXERCCIO
Quando uma pesquisa ser feita em (1)?
= n/m = O(1)
n = O(m)
T
...
h(ki) h(kj) h(kn)
i ...
... ... ...
...
(1+ )
24
12
01/03/2013
EXERCCIO
Vamos utilizar a funo hash h(k) = k%m (m=10)
para guardar os RGs. Qual o ltimo dgito do RG
de vocs? Como vai ficar a tabela hash depois de
inserirmos todos os RGs de vocs?
Ser que tem alguma funo hash melhor?
25
EXERCCIO
Vamos utilizar a funo hash h(k) = k%m (m=10)
para guardar os RGs. Qual o ltimo dgito do RG
de vocs? Como vai ficar a tabela hash depois de
inserirmos todos os RGs de vocs?
Ser que tem alguma funo hash melhor?
26
13
01/03/2013
27
MTODO DA DIVISO
Usa o resto da diviso para encotrar valores hash
Neste mtodo a funo hash da forma:
Nmero de
h(k) = k mod m clulas da tabela
28
14
01/03/2013
EXERCCIO
Seja K = {2,4,12,10,5}, desenhe a tabela final
considerando as seguintes funes hash (utilize a
resoluo de conflitos por chaining). As tabelas
possuem 2, 5 e 10 clulas
h=k mod 2
h=k mod 5
h=k mod 10
29
MTODO DA DIVISO
O mtodo da diviso garantes boas funcoes de
hashing?
O que basicamente muda entras as funes hash
no mtodo da diviso?
Que valores escolhemos para m?
30
15
01/03/2013
MTODO DA DIVISO
O mtodo da diviso garantes boas funcoes de
hashing?
O que basicamente muda entras as funes hash
no mtodo da diviso?
Qual(is) valor(es) escolhemos para m?
EXERCCIO
Suponha as chaves {200, 205, 210, 215, 220, ..., 595}.
Se eu escolher a funo h(k) = k %100. Vai existir coliso
em alguma clula? Se sim, quantas?
32
16
01/03/2013
EXERCCIO
Suponha as chaves {200, 205, 210, 215, 220, ..., 595}.
Se eu escolher a funo h(k) = k %100. Vai existir coliso
em alguma clula? Se sim, quantas?
Cada clula preenchida ter quatro chaves
Se eu escolher a funo h(k) = k %101. Vai existir coliso?
Se sim, quantas?
Cada clula preenchida ter uma chave
APPLET
http://www.cse.yorku.ca/~aaw/Hang/hash/Hash.h
tml
http://www.engin.umd.umich.edu/CIS/course.des/
cis350/hashing/WEB/HashApplet.htm
34
17
01/03/2013
MTODO DA MULTIPLICAO
Neste mtodo a funo hash da forma:
EXERCCIO
Calcule o codigo hash h = m (kA mod 1) das
chaves ({2, 3, 4, 5, 6, 10, 15}), onde A = 0.2 e m =
1000
36
18
01/03/2013
37
posicao = h(k,p)
k = chave
38
p = probe
19
01/03/2013
EXEMPLO: INSERO
Insira a chave k=100
Probe h(100,0) /
Probe h(100,1) 100
/
Probe h(100,2) 200
/
/
150
/
/
/
999
39
ALGORITMO: INSERO
40
20
01/03/2013
EXEMPLO: PESQUISA
Pesquisa a chave k=100
Probe h(100,0) /
Probe h(100,1) /
Probe h(100,2) 200
/
/
150
/
/
/
999
41
ALGORITMO: PESQUISA
42
21
01/03/2013
43
44
22
01/03/2013
EXEMPLO
Remova a chave k=100
Probe h(100,0)
/
Probe h(100,1) E como ficaria a insero?
100
X
Probe h(100,2)
200
/
/
Pesquisar at achar a 150
chave (remova coloque /
um flag DELETED) ou /
uma clula vazia
/
999
45
EXEMPLO
|| T[j] = DELETED
46
23
01/03/2013
47
LINEAR PROBING
Dada uma funcao de hash ordinaria h': U {0,1,..., m 1}
(obtida por diviso ou multiplicao) o mtodo
usa a funo de hash da forma:
h(k , i) (h' (k ) i) mod m
Slots buscados linearmente
T [(h' ( k )]
T [ h' ( k ) 1]
...
T [ m 1]
Facil de implementar mas apresenta problemas
Clustering Primrio clusters podem surgir quando slots
ocupados se agrupam. Isso aumenta o tempo da busca. 48
24
01/03/2013
EXERCCIO
Seja m=10, h(k) = k mod 5. Utilize o probing
linear para inserir os valores ({10,15,2,12,4,8})
49
PROBING QUADRTICO
Neste mtodo a funo hash da forma:
25
01/03/2013
EXERCCIO
Seja m=10, c1=3, c2=5, h(k) = k mod 5. Utilize o
probing quadrtico para inserir os valores
({10,15,2,12,4,8}):
51
EXERCCIO
Compare a resposta anterior com o linear probing
e o endereamento fechado (h(k) = k mod 10) com
chaining para inserir os valores ({10,15,2,12,4,8}):
h(k) = k mod 10
h(k,i) = (k mod 5 + i) mod 10
h(k,i) = (k mod 5 + 3i + 5i2) mod 10
52
26
01/03/2013
HASHING DUPLO
Um dos melhores metodos para endereamento
aberto
Neste mtodo a funo hash da forma:
EXERCCIO
Seja m=24, h1(k) = k mod 5 e h2(k) = k+1 mod 7.
Utilize o hashing duplo para inserir os valores
({10,15,2,12,4,8}):
54
27
01/03/2013
POSCOMP 2009
55
FATOR DE CARGA
Qual o fator de carga no endereamento aberto?
O load factor 1
Por que?
56
28
01/03/2013
57
REHASHING
Quando a capacidade preenchida (exceder 50%),
as operaes na tabela passam a demorar mais,
pois o nmero de colises aumenta
Expandir o array que constitui a tabela, e
reorganizar os elementos na nova tabela
Novo tamanho: nmero primo prximo ao dobro da
tabela atual
58
29
01/03/2013
EXEMPLO
Tamanho = 7
34 40 X 11 95
Tamanho = 13
40 95 34 11
EXERCCIO
Quando devemos fazer o rehashing?
No endereamento aberto no conseguirmos mais
inserir um elemento
Quando metade da tabela estiver ocupada (limite de
capacidade)
60
30
01/03/2013
IMPLEMENTAO
Hashtable
http://www.docjar.com/html/api/java/util/Hashtable.java
.html
Ver funes
hash()
O cdigo hash delegado para cada classe
containsKey()
get()
put()
remove()
rehash()
equals( ) x hashCode( ).
a.equals(b) hashCode(a) = hashCode(b) 61
31
01/03/2013
Hashtable HashFunction
63
Hashtable HashFunction
HashFunctionClosedAddress HashFunctionOpenAddress
int hash(Object element) int hash(Object element, int probe)
HashFunctionDivision
HashFunctionLinearProbing
HashFunctionMultiplication
HashFunctionQuadraticProbing 64
HashFunctionDoubleHashing
32
01/03/2013
Hashtable HashFunction
HashtableClosedAddress HashtableOpenAddress
HashFunctionClosedAddress HashFunctionOpenAddress
HashFunctionDivision HashFunctionLinearProbing
HashFunctionMultiplication HashFunctionQuadraticProbing 65
HashFunctionDoubleHashing
REFERNCIAS
Captulo 12
1a edio
Captulo 11
2a edio
66
33