Sei sulla pagina 1di 3

Algoritmos e Estruturas de Dados/Tabela de

Hash
Em cincia da computao a tabela hash (de hashing, no
ingls), tambm conhecida por tabela de espalhamento,
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. algumas vezes traduzida como tabela de escrutnio.

atrapalhando o desempenho.
Por causa das colises, muitas tabelas hash so aliadas
com alguma outra estrutura de dados, tal como uma lista
encadeada ou at mesmo com rvore AVL|rvores balanceadas. Em outras oportunidades a coliso solucionada
dentro da prpria tabela.

2.1 Exemplo de funo de espalhamento e


coliso

Complexidade e usos comuns

Imagine que seja necessrio utilizar uma tabela hash


para otimizarmos uma busca de nomes de uma lista
telefnica (dado o nome, temos que obter o endereo e o
telefone). Nesse caso, poderamos armazenar toda a lista
telefnica em um vetor e criar uma funo de espalhamento que funcionasse de acordo com o seguinte critrio:

Tabelas hash so tipicamente utilizadas para implementar vetores associativos, sets e cache|caches. So tipicamente usadas para indexao de grandes volumes de
informao (como bases de dados). A implementao
tpica busca uma funo hash que seja de complexidade O(1), no importando o nmero de registros na tabela (desconsiderando colises). O ganho com relao
a outras estruturas associativas (como um vetor simples)
passa a ser maior conforme a quantidade de dados aumenta. Outros exemplos de uso das tabelas hash so as
tabelas de transposio em jogos de xadrez para computador at mesmo em servios de DHCP.

Para cada nome comeado com a letra A, retornar 0 Para


cada nome comeado com a letra B, retornar 1 ... Para
cada nome comeado com a letra Z, retornar 25
O exemplo anterior poderia ser implementado, em Linguagem de programao C|C, da seguinte forma:
int hashExemplo(char * chave) { return (chave[0]65);
}

A funo de espalhamento

Agora inserimos alguns nomes em nossa lista telefnica:

A funo de espalhamento ou funo hash a responsvel


por gerar um ndice a partir de determinada chave. Caso
a funo seja mal escolhida, toda a tabela ter um mau
desempenho.

Jos da Silva; Rua das Almas, 35; Telefone


(11) 888-9999

Ricardo Souza; Rua dos Coqueiros, 54; Telefone (11) 222-4444


O ideal para a funo de espalhamento que sejam sempre fornecidos ndices nicos para as chaves de entrada.
Orlando Nogueira; Rua das Oliveiras, 125; TeA funo perfeita seria a que, para quaisquer entradas A
lefone (11) 444-5555
e B, sendo A diferente de B, fornecesse sadas diferentes.
Quando as entradas A e B so diferentes e, passando pela
funo de espalhamento, geram a mesma sada, acontece Agora inserimos mais um nome:
o que chamamos de coliso.
Renato Porto; Rua dos Elefantes, 687; TeleNa prtica, funes de espalhamento perfeitas ou quase
fone (11) 333-5555
perfeitas so encontradas apenas onde a coliso intolervel (por exemplo, nas funes hash da criptograa),
ou quando conhecemos previamente o contedo da tabela
armazenada). Nas tabelas hash comuns a coliso apenas indesejvel, diminuindo o desempenho do sistema.
Muitos programas funcionam sem que seu responsvel
suspeite que a funo de espalhamento seja ruim e esteja

Como se pode notar, a funo de exemplo causaria muitas


colises. Se inserirmos um outro nome comeado com a
letra R, teremos uma outra coliso na letra R. Se inserirmos Joo Siqueira, a entrada estaria em conito com o
Jos da Silva.
1

6 BIBLIOGRAFIA

Resolvendo colises

es de espalhamento auxiliares, onde a chave de entrada


ser o valor gerado pela funo anterior. Esse tipo de
Um bom mtodo de resoluo de colises essencial, implementao pode ser til em casos muito especcos,
no importando a qualidade da funo de espalhamento. com enormes quantidades de dados, mas normalmente o
Considere um exemplo derivado do paradoxo|paradoxo overhead no justica a experincia.
do aniversrio: mesmo que considerarmos que a funo
ir selecionar ndices aleatrios uniformemente em um
3.3 Indexao Perfeita
vetor de um milho de posies, h uma chance de 95%
de haver uma coliso antes de inserirmos 2500 registros.
Se tivermos uma relao xa de registros, podemos obter
H diversos algoritmos de resoluo de coliso, mas os uma funo que indexe os itens sem que ocorra nenhuma
mais conhecidos so Encadeamento Separado e Endere- coliso, chamada funo de espalhamento perfeita. Poamento Aberto.
demos at mesmo buscar uma funo de espalhamento
perfeita mnima, que, alm de no causar colises, preenche todas as posies da tabela. As funes de espalhamento perfeitas fazem o acesso aos dados ser O(1) no
3.1 Encadeamento Separado
pior caso.
a soluo mais simples, em que normalmente um re- Existem mtodos que atualizam a funo de espalhagistro aponta para uma lista encadeada em que so ar- mento de acordo com a entrada, de forma que nunca
mazenados os registros em conito. A insero na tabela ocorra coliso. O inconveniente dessa tcnica que
requer uma busca e insero dentro da lista encadeada; a prpria atualizao da funo de espalhamento causa
uma remoo requer atualizar os ndices dentro da lista, overhead do sistema.
como se faria normalmente.
Estruturas de dados alternativas podem ser utilizadas no
lugar das listas encadeadas. Por exemplo, se utilizarmos 4 Problemas e comparaes com
uma rvore AVL|rvore balanceada, podemos melhorar
outras estruturas
o tempo mdio de acesso da tabela hash para O(log n) ao
invs de O(n). Mas como as listas de coliso so projetadas para serem curtas, o overhead causado pela manu- Apesar das tabelas hash terem em mdia tempo constante
de busca, o tempo gasto no desenvolvimento signicateno das rvores pode fazer o desempenho cair.
tivo. Avaliar uma boa funo de espalhamento um traApesar disso, as rvores podem ser utilizadas como probalho duro e profundamente relacionado estatstica. Na
teo contra ataques que buscam criar overhead propomaioria dos casos solues mais simples como uma lista
sitalmente - descobrindo uma forma da funo gerar reencadeada devem ser levados em considerao.
petidamente o mesmo ndice - e derrubar o sistema (ataques DOS). Nesse caso, uma rvore balanceada ajudaria Os dados na memria cam aleatoriamente distribudos,
o sistema a se manter estvel, por ser uma estrutura com o que tambm causa overhead no sistema. Alm disso, e
mais importante, o tempo gasto na depurao e remoo
grande capacidade de crescimento.
de erros maior do que nas rvore AVL, que tambm
podem ser levadas em conta para soluo do mesmo tipo
de problema.
3.2 Endereamento Aberto
No mtodo de Endereamento Aberto os registros em
conito so armazenados dentro da prpria tabela. A resoluo das colises realizadas atravs de buscas padronizadas dentro da prpria tabela.
A forma mais simples de fazer a busca procurar linearmente na tabela at encontrar um registro vazio ou o registro buscado. Outras formas utilizadas incrementam o
ndice exponencialmente: caso o registro no seja encontrado na posio 10, ser buscado na posio 100, depois
na posio 1000. A insero tem que seguir o mesmo
critrio da busca.
Outra forma mais complexa de implementar o Endereamento Aberto criar uma nova funo de espalhamento
que resolva o novo conito (tambm chamado de double
hashing). Na prtica, o que acontece nesse caso que
o vetor da tabela formado por uma seqncia de fun-

5 Resumo
6 Bibliograa

Fontes, contribuidores e licenas de texto e imagem

7.1

Texto

Algoritmos e Estruturas de Dados/Tabela de Hash Fonte: http://pt.wikibooks.org/wiki/Algoritmos%20e%20Estruturas%20de%


20Dados/Tabela%20de%20Hash?oldid=203748 Contribuidores: Master e He7d3r.bot

7.2

Imagens

7.3

Licena

Creative Commons Attribution-Share Alike 3.0

Potrebbero piacerti anche