Você está na página 1de 33

01/03/2013

ESTRUTURAS DE DADOS E
ALGORITMOS

TABELA HASH
1 Adalberto Cajueiro
Departamento de Sistemas e Computao
Universidade Federal de Campina Grande

ESTRUTURAS VISTAS AT AGORA


Estruturas lineares: vetor, fila, lista e pilha
Ordenadas ou no
rvores Binrias de Pesquisa
Ordenadas
Heaps Binrias
Chaves com certa ordem
Todas so estruturas de busca e levam tempo at
encontrar o elemento desejado
8
5 2 6 1 7 8 4 9
2 9
2
5 2 6 1 4
1 6
4

1
01/03/2013

ESTRUTURAS VISTAS AT AGORA


Estruturas lineares: vetor, fila, lista e pilha
Ordenadas ou no Ser que existe alguma
rvores Binrias de Pesquisa forma de estruturar os
Ordenadas dados para que as
Heaps Binrias pesquisas sejam O(1)?
Chaves com certa ordem
Todas so estruturas de busca e levam tempo at
encontrar o elemento desejado
8
5 2 6 1 7 8 4 9
2 9
3
5 2 6 1 4
1 6
4

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

TABELA DE ACESSO DIRETO

Admitindo que K relativamente pequeno


5

TABELA DE ACESSO DIRETO


Acesso
Poucos elementos direto
Seja k U = {0,1,2...,m-1}
Todas as chaves da tabelas so distintas /

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

TABELA DE ACESSO DIRETO


Operaes (inserir, remover, pesquisar)
utilizando a tabela de acesso direto.

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

TABELA DE ACESSO DIRETO (PROBLEMAS)

O que acontece se U for muito grande?


E se K for muito pequeno em relacao a U? 8

O que acontece quando |U| muito maior que length(T)?

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}

Se |U| > length(T) pelo menos duas chaves so


mapeadas para o mesmo ndice (coliso)
impossvel no ter colises
Elas devem ser minimizadas 9

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

RESOLUO DE COLISES (ABORDAGENS)


Endereamento fechado
Elementos com mesmo cdigo hash so colocados na
mesma posio da tabela (chaining)
Na verdade, inseridos na cabea da lista j que existe a
idia que o o elemento inserido ser usado em breve
Endereamento aberto
Chaves com mesmo cdigo hash so colocadas em
posies diferentes

15

ENDEREAMENTO FECHADO: CHAINING


Usar uma lista encadeada

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)];

Faa a anlise do pior caso das operaes (inserir, remover, pesquisar)

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?

Como escolher uma funo hash?

26

13
01/03/2013

CARACTERSTICAS DA FUNO HASHING


Minimizar o nmero de colises
Satisfazer a hiptese de hashing uniforme
Qualquer chave tem a mesma probabilidade de ser
mapeada em qualquer um dos m slots. Mas difcil
Alguns mtodos ajudam
Diviso
Multiplicao
Consideramos as chaves como nmeros
Fcil de mapear Strings,... para nmeros

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

Mtodo rpido (requer apenas uma divisao)

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?

No escolha um m tal que tenha um divisor d


bem pequeno
No escolha m = 2r,

Escolha m sendo um nmero primo que no seja


prximo das potncias de 2 ou 10
31

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?

Se eu escolher a funo h(k) = k %101. Vai existir coliso?


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

0 200, 300, 400, 500 101 202 303 404 505


...
200 205 210 215 220, ... , 295, 300
5 205, 305, 405, 505
... 099 003 008 013 018, ... , 093, 098
10 210, 310, 410, 510 33
... 305 310 315 320 325, ... , 395, 400
002 007 012 017 023, ... , 092, 097

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:

h(k) = m (k.A mod 1)


Extrai a parte fracionria de k.A
k a chave
A uma constante entre (0..1)
Um bom valor A ( 5 1) / 2 0.6180339887...

m (nmero de clulas) geralmente 2p, onde p inteiro


O valor de m no crtico como no mtodo da
diviso
Um pouco mais lento do que o da diviso
35

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

h(2) = 1000 (2x0.2 mod 1) = 400


h(3) = 1000 (3x0.2 mod 1) = 600
h(4) = 1000 (4x0.2 mod 1) = 800
h(5) = 1000 (5x0.2 mod 1) = 000
h(6) = 1000 (6x0.2 mod 1) = 200
h(10) = 1000 (10x0.2 mod 1) = 000
h(15) = 1000 (15x0.2 mod 1) = 000

36

18
01/03/2013

TABELA COM ENDEREAMENTO ABERTO


At agora vimos a resoluo de conflitos por
chaining (Endereamento Fechado)
Precisa de uma estrutura de dados auxiliar (lista)
E se no tivermos listas para resolver as colises?
Precisamos de um nmero m bem maior de clulas.
Chaves que colidam precisam ter seu hash code
recalculado para encontrar um slot vazio
Todas as chaves esto em alguma clula. Cada entrada da
tabela ou contem um elemento ou NIL

37

OUTRA FORMA DE RESOLVER CONFLITOS


Endereamento aberto faz uso de um probe.
Examina a tabela (sequencial ou nao) at encontrar
um slot vazio.
A sequencia de posicoes sendo examinadas dependem
da chave
Funo hash estendida

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

ENDEREAMENTO ABERTO (DELEO)


Como fazer uma remocao com enderecamento
aberto?
Podemos atribuir NIL diretamente na posio da
chave a ser removida?

43

ENDEREAMENTO ABERTO (DELEO)


Como fazer uma remocao com enderecamento
aberto?
Nao podemos simplesmente dizer que o slot esvaziou
colocando NIL
Usar uma flag (valor especial DELETED) ao invs de
NIL
Alterar as funes
Inserir (inserir no flag se ele for DELETED)
Pesquisar (continuar a pesquisa no flag ao invs de NIL)

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

HASHING COM PROBING


Como escolher a funo hash no endereamento
aberto usando o probe?
Por que no utilizar a funo h(k,i) = k%m?
Precisamos usar i para que o endereo mude.
Tres tcnicas so usadas para computar as
sequencias de probes
Linear Probing
Quadratic Probing
Double Hashing

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})

h(k,i) = (k mod 5 + i) mod 10

49

PROBING QUADRTICO
Neste mtodo a funo hash da forma:

h(k , i) (h' (k ) c1i c2i 2 ) mod m

Mtodo da Diviso ou Multiplicao


c1 e c2 so constantes
Primeiro elemento buscado T[h(k)]. Demais
variam com funcao quadratica de i.
Evita o clustering primrio
Pode ocorrer um Clustering Secundrio duas chaves
com mesmo probe inicial geram mesma sequencia de
probes
50
Mas melhor do que o anterior

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}):

h(k,i) = (k mod 5 + 3i + 5i2) mod 10

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:

h(k , i) (h1 (k ) i.h2 (k )) mod m


Mtodo da Diviso ou Multiplicao

A sequencia de probe depende de duas formas em k.


Dicas
Faa h2(k) retornar um nmero mpar e m ser um nmero 2
p

Faa m ser um numero primo e h2(k) retornar um inteiro


positivo menor que m
Excelentes resultados
Produz (m) sequncias (se aproxima mais do hashing 53
uniforme simples)

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}):

h(k,i) = (k mod 5 + (k+1 mod 7).i) mod 24

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

LIDANDO COM OVERFLOW


O que fazer quando o vetor interno da tabela
hash ficar cheio?
Duplicar quando estiver cheio?
Duplicar quando atingir uma certa capacidade?

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

Object put() { ...


if (++size > threshold)
rehash(); ...
}
void rehash() { ...
newcapacity = prime number near 2*buckets;
threshold = (int) (newcapacity * loadFactor);
buckets = new HashEntry[newcapacity]; ... 59
}

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

TABELA HASH (IMPLEMENTAO)


Como seria representada uma tabela hash em
Java?

public interface Hashtable<T> {


public boolean isEmpty();
public boolean isFull();
public int capacity();
public int size();
public void insert(T element);
public void remove(T element) ;
public T search(T element);
public int indexOf(T element); 62
}

31
01/03/2013

TABELA HASH (IMPLEMENTAO)


Separando a tabela de sua funo hash?

Hashtable HashFunction

63

TABELA HASH (IMPLEMENTAO)


Separando a tabela de sua funo hash?

Hashtable HashFunction

HashFunctionClosedAddress HashFunctionOpenAddress
int hash(Object element) int hash(Object element, int probe)

HashFunctionDivision
HashFunctionLinearProbing
HashFunctionMultiplication
HashFunctionQuadraticProbing 64

HashFunctionDoubleHashing

32
01/03/2013

TABELA HASH (IMPLEMENTAO)


Separando a tabela de sua funo hash?

Hashtable HashFunction

HashtableClosedAddress HashtableOpenAddress

HashFunctionClosedAddress HashFunctionOpenAddress

HashFunctionDivision HashFunctionLinearProbing
HashFunctionMultiplication HashFunctionQuadraticProbing 65

HashFunctionDoubleHashing

REFERNCIAS
Captulo 12
1a edio
Captulo 11
2a edio

66

33