Вы находитесь на странице: 1из 7

Tabela Hash

Variaes na tcnica de pesquisa, conhecidas como


hashing, tm sido implementadas em muitos
compiladores.
Hashing aberto (aberto por no precisar haver limite
no nmero de entradas que podem ser feitas numa
tabela). Esse esquema nos d ainda a capacidade de
realizar e entradas sobre n nomes num tempo
proporcional a n(n+e)/m, para qualquer constante m de
nossa escolha.
Uma vez que m pode ser feita to grande quanto
desejamos, at o limite de n, esse mtodo
geralmente mais eficiente do que as listas lineares. o
mtodo de escolha para as tabelas de smbolos na
maioria das situao [AHO, SETHI & ULLMAN, 86]
Tabela Hash

O esquema bsico de hashing ilustrado na figura


a seguir. Existem duas partes para a estrutura
de dados [AHO, SETHI & ULLMAN, 86]:
1. Uma tabela hash, consistindo em um array fixo
de m apontadores para entradas da tabela.
2. As entradas da tabela so organizadas em m
listas ligadas separadas, chamadas de buckets
(algumas das quais podem ficar vazias). Cada
registro na tabela de smbolos figura exatamente
em uma dessas listas. O armazenamento para
os registros pode ser delineado a partir de um
array de registros.
Tabela Hash
Array de cabealhos de listas indexados pelo valor de

cp n
9

match
20

last action ws
32

Elementos de listas criados para os nomes mostrados


210
Figura: Uma tabela hash de tamanho
211.
Tabela Hash

Para se determinar se existe uma entrada para uma


cadeia de caracteres s na tabela de smbolos,
aplicamos uma funo de hash h a s de tal forma
que h(s) retorne um inteiro entre 0 e m-1.
Se s estiver na tabela de smbolos, estar na lista
enumerada por h(s) e se ainda no estiver
introduzida atravs da criao de um registro para a
mesma, que ligado ao incio da lista numerada por
h(s).
A lista mdia tem um comprimento de n/m registros, se
existirem n nomes numa tabela de comprimento m.
Tabela Hash

O espao ocupado pela tabela de smbolos consiste


de m palavras para a tabela hash e cn palavras
para as entradas da tabela, onde c o nmero de
palavras de entrada na tabela. Por conseginte, o
espao para a tabela hash depende somente de
m e o espao para as entradas da tabela depende
somente do nmero de entradas.
Uma boa ateno tem sido dada questo de como
projetar uma funo de hash que seja fcil de
computar para as cadeias de caractreres, alm de
distribu-las uniformemente dentre as m listas.
Tabela Hash

Uma abordagem adequada ao cmputo das funes de


hash est em se proceder da seguinte forma [AHO, SETHI &
ULLMAN, 86]:
1. determinar um inteiro positivo h a partir dos caracteres
c1,c2,...ck na cadeia s. A converso de caracteres singelos
para inteiros usualmente suportada pela linguagem de
programao. Pascal providencia a funo ord com esse
propsito; C converte automaticamente um caracter para um
inteiro, se uma operao aritmtica for realizada sobre o
mesmo;
2. converter o inteiro h determinado acima no nmero de uma
lista, isto , um inteito entre 0 e m-1. Simplesmente dividir por
m e ficar com o resto uma poltica razovel. Ficar com resto
parece funcionar melhor se m for primo (ver na figura m=211).
Tabela Hash

Uma tcnica simples para computar h est em


adicionar os valores inteiros dos caracteres na
cadeia. Uma idia melhor est em multiplicar o
valor antigo de h por uma constante antes de
adicionar o prximo caractere. Isto , fazendo-se
h0=0, hi= hi-1+cj, para 1 i k e seja h=hk, onde k
o tamanho da cadeia (relembramos que o valor
de hash que d o nmero de listas h mod m).