Você está na página 1de 37

Tabela Hash

Histria
Os estudos sobre tabela hash surgiram independentemente em
vrios momentos e locais.

H. P. Luhn, em 1953, teve a idia enquanto trabalhava na IBM


(estavam construindo um compilador)

G. N. Amdahl, E. M. Boehme, N. Rochester, e Arthur Samuel


implementaram um programa usando tabelas de disperso na
mesma poca
Tabela de smbolos: as chaves de elementos so cadeias de
caracteres que correspondem a identificadores na linguagem

Primeiro artigo sobre hashing foi publicado em 1956 numa


revista Americana

Endereamento aberto publicado em 1957 na Rssia todos os


elementos so armazenados na prpria tabela hash (no
existem listas nem elementos armazenados fora da tabela,
evitando assim o uso de ponteiros)
Definio Tabela Hash
Em cincia da computao a tabela hash (de hashing, no
ingls), tambm conhecida por tabela de disperso, uma
estrutura de dados especial, que associa chaves de pesquisa
(hash) a valores. Seu objetivo , a partir de uma chave
simples, fazer uma busca rpida e obter o valor desejado.
Usos Comuns
Implementar vetores associativos, sets e caches.
Indexao de grandes volumes de informao (como bases de
dados).
Redes
Jogos
Dicionrio
Tabelas de Endereamento Direto

Funciona bem quando o universo de chaves razoavelmente


pequeno.
Se o conjunto no contm nenhuma elemento com chave k,
ento T[k]=NIL
Tabela Hash (Universo Grande)
Funo matemtica elaborada
Tabela Hash Encadeada
todos os elementos mapeados para uma mesma posio so
armazenados em uma lista ligada.
Endereamento aberto
Todos os elementos esto armazenados na prpria tabela hash
Funo Hash

Os registros armazenados em uma tabela so diretamente


endereados a partir de uma transformao aritmtica sobre a
chave de pesquisa.

Qualquer que seja a funo de transformao, algumas


colises iro ocorrer fatalmente, e tais colises tm de ser
resolvidas de alguma forma.
Mtodo da Diviso
Posio = Valor mod Tvetor
Exemplo:
Pretende-se armazenar nmeros numa tabela de hash por forma
a melhorar o processo de procura desses elementos
armazenados. Os elementos a guardar so os seguintes: 19, 26,
33, 70, 79, 103, 110.
Exemplo
Posio = Valor mod Tvetor
Posio = 110 mod 10
Posio = 0
Evitando a disperso
Uma ajuda sugerida a utilizao somente de nmeros
primos ao invs do tamanho do vetor.

Exemplo: Para armazenar 2000 elementos em uma tabela


hash. No importando em visitar 3 elementos em uma
pesquisa mal sucedida. O nmero primo escolhido deve ser o
mais prximo de 2000/3. Um bom valor 701

Ento: Posio = Valor mod 701


Mtodo de Multiplicao
Opera em duas etapas:
Primeiro, multiplicamos k por uma constante A no intervalo
0<A<1 e mantemos apenas a parte fracionria do resultado;
Logo aps, multiplicamos esse valor por m e tomamos o piso
do resultado.

h(n) = [m(kA mod 1)]

ka mod 1 significa a parte fracionria de kA;


A: uma constante igual a 0.6180339887, definida por Knuth ( 5 - 1
)/2

O valor de m no crtico, usualmente uma potncia de 2.


Exemplo Mtodo Multiplicao
K=123456, m=16384 e A=0,6180339887

h(n) = [m(kA mod 1)]


h(123456) =[16384 x (123456 x 0,6180339887 mod 1)]
h(123456) =[16384 x (76300,0041089472 mod 1)]
h(123456) =[16384 x 0,0041089472]
h(123456) = 67,3209909248
h(123456) = 67
Hash Universal
Qualquer funo hash est sujeita ao problema de criar chaves
iguais para elementos distintos. Dependendo da entrada,
algumas funes hash podem espalhar os elementos de forma
mais equilibrada que outras. Desta forma, se pudermos
utilizar diferentes funes hash, teremos em mdia um
espalhamento mais equilibrado.
O hashing universal refere-se um seleo aleatria(em
tempo de execuo) de uma funo hash a partir de um
conjunto de funes cuidadosamente desenhado. Est
estratgia tenta minimizar o problema de colises e
geralmente muito eficiente.
O hashing universal tem numerosos usos na cincia da
computao, por exemplo: implementaes de tabelas de
hash, algoritmos randomizados e criptografia.
Estratgias Endereamento
Aberto

Teste Linear;

Teste Quadrtico e

Hashing Duplo.
Teste Linear
uma estratgia simples:
Sendo A a tabela onde se quer inserir o dado
Se ao tentar-se inserir o item na posio A[i] (porque h(k)=i), essa
j estiver ocupada ento tenta de novo na posio:
h1(k) = (i+1) % N, onde N o nro de entradas na Tabela Hash
Se essa posio tambm estiver ocupada, ento tenta-se na
posio:
h2(k) = (i+2) % N,
Exemplo
0
1
13 2
3
26 4
5 5
37 6
16 7
8
9
10
11
Exemplo 2
Suponha que queiramos inserir, nesta ordem, os caracteres da
palavra CHAVES utilizando o mtodo de resoluo de
colises Teste Linear;
O nmero de entradas (N) da Tabela Hash em questo 7;
Digamos que a funo hash o nmero do caractere na tabela
ASC.

Chave C H A V E S
K=ord(Chave) 67 72 65 86 69 83
Exemplo 2
Exemplo
h(k) = i % 7
h(k) = (i+1) % 7
Chave K = ord (chave) i0 = h(k) i1 = h(k) i2 = h(k) i3 = h(k)
C 67 4 - - -
H 72 2 - - -
A 65 2 3 - -
V 86 2 3 4 5
E 69 6 - - -
S 83 6 0 - -
Exemplo 2
Resultado final
Chave K = ord (chave) i0 = h(k) i1 = h(k) i2 = h(k) i3 = h(k)
C 67 4 - - -
H 72 2 - - -
A 65 2 3 - -
V 86 2 3 4 5
E 69 6 - - -
S 83 6 0 - -

0 1 2 3 4 5 6
S H A C V E
Teste Quadrtica Sondagem
Quadrtica
Utiliza uma funo hash auxiliar.
A sondagem quadrtica no garante que se encontre sempre
uma posio livre para um dado elemento.
Quando o tamanho da tabela primo, e se usa sondagem
quadrtica, sempre possvel inserir um elemento se a tabela no
estiver preenchida a mais de 50%
Desempenho aproxima-se do caso ideal sem agregao
A gerao de posies alternativas na sondagem quadrtica
pode ser realizada com apenas uma multiplicao : Hi= ( Hi-1 +
2i 1 ) mod TableSize
Exemplo Sondagem Quadrtica
hash(x) = x % 10
H(x) = ( hash(x) + i2 ) % 10
i a quantidade de sondagem
Exemplo: 58
H(x) = ( hash(x) + i2 ) % 10
H(x) = ( 8 + 02 ) % 10 = 8 //Ocupado
H(x) = ( 8 + 12 ) % 10 = 9 //Ocupado
H(x) = ( 8 + 22 ) % 10 = 2 //Livre
Hash Duplo
Um dos melhores mtodos disponveis para endereamento
aberto

H(k,i) = (h1(k) + ih2(k)) mod m

Onde h1 e h2 so funes hash auxiliares

Se a posio estiver ocupada, a funo de ser usada


sucessivas vezes at que uma posio vazia seja encontrada.
Exemplo Hash Duplo
Para o primeiro clculo:
h(k) = k mod N
Caso haja coliso, inicialmente calculamos h2(K), que pode ser
definida como:
h2(k) = 1 + ( k mod (N-1) )
Em seguida calculamos a funo rehashing como sendo:
rh(i,k) = ( i + h2(k) ) mod N
Exemplo Hash Duplo
Suponha uma tabela com 10 entradas (N = 10), todas
inicialmente vazias.

A insero do valor 35 ser feita na posio 5.

h(35) = 35 mod 10

H(35) = 5
Exemplo Hash Duplo
A insero, em seguida, do valor 65 ser calculada da seguinte
maneira:
h(65) = 65 mod 10
h(65) = 5

Coliso: Aplicar hash duplo!


Exemplo Hash Duplo
h(65) = 65 mod 10
H(65) = 5 (coliso)

h2(65) = 1 + ( 65 mod (10-1) )


h2(65) = 1 + (65 mod 9)
h2(65) = 1 + 2
h2(65)= 3

rh(5,65) = (5 + 3) mod 10 = 8

Portanto, 65 ser inserido na posio 8 da tabela


Anlise do hash de endereo
Aberto
Seja = N/M o fator de carga da tabela. Conforme
demonstrado por Knuth (1973), o custo de uma pesquisa com
sucesso :

O hashing linear sofre de um mal chamado


agrupamento(clustering) (Knuth, 1973, pp.520521).
Este fenmeno ocorre na medida em que a tabela comea a car
cheia, pois a insero de uma nova chave tende a ocupar uma
posio na tabela que esteja contgua a outras posies j
ocupadas.
Anlise do hash de endereo
Aberto
Apesar do hashing linear ser um mtodo relativamente pobre
para resolver colises os resultados apresentados so bons.

O melhor caso, assim como o caso mdio, O(1).

Qual o pior caso?


Quando necessrio percorrer toda a tabela para encontrar uma
chave (excesso de colises).
Complexidade do pior caso: O(n)
Hash Perfeito

Em aplicaes muito particulares onde o conjunto de chaves


esttico e conhecido a prioridade, pode-se projetar um
hashing perfeito
por exemplo, conjunto de palavras reservadas de uma linguagem
de programao (aplicao em compiladores)

Esse tipo de hashing executa todas as operaes de busca,


insero e remoo em tempo O(1) no Pior Caso
Vantagens
Simplicidade
muito fcil de imaginar um algoritmo para implementar hashing.
Escalabilidade
Podemos adequar o tamanho da tabela de hashing ao n esperado em
nossa aplicao.
Eficincia para n grandes
Para trabalharmos com problemas envolvendo n = 1.000.000 de
dados, podemos imaginar uma tabela de hashing com 2.000
entradas, onde temos uma diviso do espao de busca da ordem
de n/2.000 de imediato.
Aplicao imediata a arquivos
Os mtodos de hashing, tanto de endereamento aberto como
fechado, podem ser utilizados praticamente sem nenhuma alterao
em um ambiente de dados persistentes utilizando arquivos em disco.
Desvantagens
Dependncia da escolha de funo de hashing
Para que o tempo de acesso mdio ideal T(n) = c1 . (1/b).n +
c2 seja mantido, necessrio que a funo de hashing divida o
universo dos dados de entrada em b conjuntos de tamanho
aproximadamente igual.
Tempo mdio de acesso timo somente em uma faixa
A complexidade linear implica em um crescimento mais rpido
em relao a n do que as rvores, p.ex.
Existe uma faixa de valores de n, determinada por b, onde o
hashing ser muito melhor do que uma rvore.
Fora dessa faixa pior.
Bibliografia 1
Disponvel em: <quatinetwork.files.wordpress.com/2012/02/tabela_dispersao.pdf> Acesso em 09
de maio de 2013.
Disponvel em: <www2.dcc.ufmg.br/disciplinas/aeds2_turmaA1/aeds2.html> Acesso em 09 de
maio de 2013.
Disponvel em: <www.cs.auckland.ac.nz/software/AlgAnim/hash_tables.html#hash_anim> Acesso
em 10 de maio de 2013.
Disponvel em: <www.cse.yorku.ca/~aaw/Hang/hash/Hash.html> Acesso em 11 de maio de 2013.
Disponvel em:
<mainline.brynmawr.edu/Courses/cs206/spring2004/WorkshopApplets/Chap11/Hash/Hash.html
> Acesso em 10 de maio de 2013.
Disponvel em:
<mainline.brynmawr.edu/Courses/cs206/spring2004/WorkshopApplets/Chap11/HashChain/Hash
Chain.html> Acesso em 11 de maio de 2013.
Disponvel em: <scis.athabascau.ca/html/lo/repos/comp272/applets/hashing/> Acesso em 10 de
maio de 2013.
Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronaldo L.; Stein, Clifford; Algoritmos: teoria e
prtica: traduo da 2 edio , Vandenberg D. de Souza, Ed. Campus, 2002. ISBN 85-352-0926-3.
Aho, Alfred V.; Sethi , Ravi; Ullman, Jeffrey D.; Compiladores: Princpios, Tcnicas e Ferramentas ,
2 edio , Ed. Guanabara Koonga S.A, 1995.
Biografia 2
Disponvel em: <users.ecs.soton.ac.uk/lcc08r/disciplinas/algoritmos/slides/08-hash.pdf>
Acesso em 10 de maio de 2013.
Disponvel em: <www.lcad.icmc.usp.br/~nonato/ED/Hashing/node36-c.html> Acesso em
09 de maio de 2013.
Disponvel em: <sftcode.blogspot.com.br/2012/10/normal-0-21-false-false-false-pt-br-
x.html> Acesso em 08 de maio de 2013.
Disponvel em: <cavmelo.files.wordpress.com/2010/03/aed2_15.pdf> Acesso em 09 de
maio de 2013.
Disponvel em: <www.ic.unicamp.br/~zanoni/mo637/aulas/hash.pdf> Acesso em 09 de
maio de 2013.
Disponvel em: <www.inf.ufsc.br/~ine5384-hp/Hashing/#9.5 Complexidade> Acesso em 09
de maio de 2013.
Disponvel em: <www.comp.ita.br/~mamc/folhetos/2.pdf> Acesso em 09 de maio de 2013.
Disponvel em: <web.fe.up.pt/~prog2/docs/dispersao.pdf> Acesso em 09 de maio de 2013.
Disponvel em: <marciobueno.com/arquivos/ensino/ed2/ED2_08_Hashing.pdf> Acesso em
09 de maio de 2013.
Disponvel em: <itaporangasp.com/usp/estrutura_dados/teoria/Aula30._Hashing.pdf>
Acesso em 09 de maio de 2013.
Disponvel em: <www.decom.ufop.br/toffolo/site_media/uploads/2011-
2/bcc202/slides/22._hashing.pdf> Acesso em 09 de maio de 2013.