Você está na página 1de 8

Tabelas Hash

Nesta aula so discutidos modos de armazenar informaes em um vetor, e depois procurar por uma informao Tabelas Hash constituem uma abordagem comum para o problema de armazenar e procurar dados Esta apresentao introduz a tabela hash

O Que uma Tabela Hash ?


A forma mais simples de tabelas hash um vetor de registros. Este exemplo tem 701 registros.
[1] [2] [3] [4] [5] [6] ... Um vetor de registros [ 701]

O Que uma Tabela HashNumber ?


Cada registro tem um campo especial, chamado de chave. Neste exemplo, a chave um campo de inteiro longo chamado Number.
[1] [2] [3] [4] [5] [6]

[5]
506643543

O Que uma Tabela HashNumber ?


O nmero deve ser um identificador para cada pessoa, e o resto do registro contm informaes sobre a mesma.

[5]
506643543

[ 701] ...

[1]

[2]

[3]

[4]

[5]

[6] ...

[ 701]

O Que uma Tabela Hash ?


Quando uma tabela hash est sendo usada, algumas clulas contm registros vlidos, e outras esto vazias.

Inserindo um Novo Registro


Number 580625685

Para inserir um novo registro, a chave deve, de alguma maneira, ser convertida em um ndice de vetor. O ndice chamado de valor hash da chave.
[6] ... [ 701]
Number 155778322

[1]

[2]
Number 281942902

[3]
Number 506643543

[4]

[5]
Number 506643543

[1]

[2]
Number 281942902

[3]
Number 506643543

[4]

[5]
Number 506643543

[6] ...

[ 701]
Number 155778322

Inserindo um Novo Registro


Number 580625685

Inserindo um Novo Registro


Number 580625685

Maneira tpica de se criar um valor hash:


(Number % 701) + 1

Maneira tpica de se criar um valor hash:


(Number % 701) + 1

Quanto (580625685 % 701) + 1 ?


[1] [2]
Number 281942902

Quanto (580625685 % 701) + 1 ?


[6] ... [ 701]
Number 155778322

4
[6] ... [ 701]
Number 155778322

[3]
Number 506643543

[4]

[5]
Number 506643543

[1]

[2]
Number 281942902

[3]
Number 506643543

[4]

[5]
Number 506643543

Inserindo um Novo Registro


Number 580625685

Inserindo um Novo Registro


O valor hash usado para a localizao do novo registro.

O valor hash usado para a localizao do novo registro.

4
[1] [2]
Number 281942902

[3]
Number 506643543

[4]

[5]
Number 506643543

[6] ...

[ 701]
Number 155778322

[1]

[2]
Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6] ...

[ 701]
Number 155778322

Colises
Aqui temos um novo registro a ser inserido, com um valor hash igual a 3.

Number 701466868

Colises
Isto chamado de coliso, porque j h outro registro vlido em [3]. Quando ocorrer uma coliso, mova-se pelo vetor at encontrar uma clula vazia.
[1] [2]
Number 281942902

Number 701466868

Meu valor hash [3]. [1] [2]


Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6] ...

[ 701]
Number 155778322

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6] ...

[ 701]
Number 155778322

Colises
Isto chamado de coliso, porque j h outro registro vlido em [3]. Quando ocorrer uma coliso, mova-se pelo vetor at encontrar uma clula vazia.
[1] [2]
Number 281942902

Number 701466868

Colises
Isto chamado de coliso, porque j h outro registro vlido em [3]. Quando ocorrer uma coliso, mova-se pelo vetor at encontrar uma clula vazia.

Number 701466868

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6] ...

[ 701]
Number 155778322

[1]

[2]
Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6] ...

[ 701]
Number 155778322

Colises
Isto chamado de coliso, porque j h outro registro vlido em [3]. O novo registro vai para a clula vazia.
[1] [2]
Number 281942902

Questo
Onde voc estaria nesta tabela, se no houver colises? Use o nmero de seu R.G. ou um outro nmero de sua preferncia.
[6]
Number 701466868

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[ 701] ...
Number 155778322

[1]

[2]
Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6]
Number 701466868

[ 701] ...
Number 155778322

Procurando uma Chave


Os dados associados a uma chave podem ser localizados fcil e rapidamente.

Number 701466868

Procurando uma Chave


Calcule o valor hash. Confira a chave do elemento do vetor com a chave procurada.

Number 701466868

Meu valor hash [3]. No sou eu. [1] [2]


Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6]
Number 701466868

[ 701] ...
Number 155778322

[1]

[2]
Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6]
Number 701466868

[ 701] ...
Number 155778322

Procurando uma Chave


Continue movendo-se at encontrar a chave ou uma clula vazia.

Number 701466868

Procurando uma Chave


Continue movendo-se at encontrar a chave ou uma clula vazia.

Number 701466868

Meu valor hash [3]. No sou eu. [1] [2]


Number 281942902

Meu valor hash [3]. No sou eu. [1] [2]


Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6]
Number 701466868

[ 701] ...
Number 155778322

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6]
Number 701466868

[ 701] ...
Number 155778322

Procurando uma Chave


Continue movendo-se at encontrar a chave ou uma clula vazia.

Number 701466868

Procurando uma Chave


Quando o item encontrado, a informao pode ser copiada para o local necessrio.

Number 701466868

Meu valor hash [3]. Sim! [1] [2]


Number 281942902

Meu valor hash [3]. Sim! [1] [2]


Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6]
Number 701466868

[ 701] ...
Number 155778322

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6]
Number 701466868

[ 701] ...
Number 155778322

Removendo um Registro
Registros podem tambm ser removidos da tabela hash.

Removendo um Registro
Registros podem tambm ser removidos da tabela hash. Mas o local no pode ser deixado como uma clula vazia ordinria, pois pode interferir nas buscas.

Por favor, me remova. [1] [2]


Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]
Number 506643543

[6]
Number 701466868

[ 701] ...
Number 155778322

[1]

[2]
Number 281942902

[3]
Number 506643543

[4]
Number 580625685

[5]

[6]
Number 701466868

[ 701] ...
Number 155778322

Deletando um Registro
Registros podem tambm ser removidos da tabela hash. Mas o local no pode ser deixado como uma clula vazia ordinria, pois pode interferir nas buscas. O local deve ser marcado de alguma maneira especial para que na busca possa-se saber que havia algo l.
[1] [2]
Number 281942902

Pseudo-Cdigo
int Hash-Insert(T,k) Hash- Insert(T,k) // pr: tabela hash T[1..P], chave de busca k // ps: insere k em T, retornando posio de insero // H(.,.) funo de mapeamento i = 0; do { h = H(k,i); if (T[h] est livre) livre) { T[h] = k; return h; } else i = i + 1; } while (i != P); cerr << Error: hash table overflow; Error: overflow;

[3]
Number 506643543

[4]
Number 580625685

[5]

[6]
Number 701466868

[ 701] ...
Number 155778322

Pseudo-Cdigo
int Hash-Search(T,k) Hash-Search(T,k) // pr: tabela hash T[1..P], chave de busca k // ps: retorna posio onde k foi achada ou zero c.c. // H(.,.) funo de mapeamento i = 0; do { h = H(k,i); if (T[h].key == k.key) (T[h].key return h; else i = i + 1; } while (i != P && T[h] no est livre); no livre); return 0; // no encontrado

Fator de Carga
Usualmente indicado por (alpha) alpha) Definio: O nmero de elementos ocupados em uma tabela hash (n) dividido pelo nmero total de elementos disponveis (P) (P Quanto maior o fator de carga, mais lento o processo de recuperao Com endereamento aberto, 0 <= <= 1 Com endereamento encadeado, freqentemente >1

Funes de Mapeamento
Uma funo hash de boa qualidade satisfaz (aproximadamente) hiptese do hash uniforme simples: cada chave tem igual probabilidade de efetuar o mapeamento para qualquer uma das P posies da tabela, no importando a posio para onde foi feito o hash de qualquer outra chave Todavia, raro conhecer a distribuio de probabilidade segundo a qual as chaves so obtidas Na prtica podem ser usadas heursticas para criar uma funo hash que provavelmente ter um bom desempenho Endereamento

Funes de Mapeamento Endereamento Aberto


P um nmero primo, no prximo a uma potncia de 2 Mapeamento simples

H(k) = k % P (intervalo 0 at P-1) PH(k) = k % P + 1 (intervalo 1 at P) H(k,i) = (H(k) + i) % P H(k,i) = (H(k) + i2) % P H(k,i) = (H(k) + c1*i + c2*i2) % P H(k,i) = (H1(k) + i*H2(k)) % P (H i*H

Sondagem Linear (0 <= i <= P-1) P

Sondagem Quadrtica

(c1,c2 constantes)

Aberto: mtodo de solucionar colises no qual todos os elementos so armazenados dentro da prpria tabela hash Encadeado: colises so mantidas em uma estrutura de dados separada (por exemplo, uma lista linear)

Hash duplo po

Endereamento Aberto
Vimos que = n/P, e 0 <= <= 1 neste n/P, caso Quando n e P tendem a infinito, o nmero mdio de sondagens em uma busca malsucedida no mximo 1/(1-), para hash 1/(1uniforme Idem para insero

Endereamento Encadeado

U (universo de chaves) k1 K (chaves reais) k3 k2 k5 k4

k1

k4

k3 k2 k5

Endereamento Encadeado
No encadeamento, todos os elementos que efetuam hash para um mesmo valor so colocados em uma lista linear A posio T[h] contm um ponteiro para o incio T[h da lista de todos os elementos armazenados que efetuam hash para h Se no houver nenhum desses elementos, a posio T[h] conter NULL (ou NIL ou qualquer T[h valor que indique trmino da lista)

Endereamento Encadeado
Tempos no pior caso

Insero: O(1) Busca: tempo proporcional ao tamanho da lista Remoo: O(1) se as listas forem duplamente encadeadas; se no for, tempo proporcional ao tamanho da lista

Busca no caso mdio: O(1+), sob a O(1+ hiptese de hash uniforme simples

Interpretao de Chaves como Nmeros Naturais


A maioria das funes hash assume que o universo de chaves o conjunto N = {0, 1, 2, ...} de nmeros naturais Se as chaves no so nmeros naturais, deve-se deveencontrar um modo de interpret-las como interpretnmeros naturais em notao de base apropriada Por exemplo pt poderia ser interpretado como o par de inteiros (112, 116), pois p=112 e t=116 no conjunto de caracteres ASCII Expresso como um inteiro de base 128, pt se torna (112*128)+116 = 14452

Exemplo de Transformao de Chave String para Inteiro


int Transform(string s) Transform(string // pr: s chave a ser transformada // ps: retorna s convertida para um nmero // natural // BASE = 128 (ASCII) ou 256 (ASCII Estendido) k = 0; for(i=0; i<s.length(); i++) for(i=0; i<s.length(); i++) k = (k * BASE + s[i]) % P; return k;

Especificao para uma Tabela Hash


Operaes: Criao Destruio Status Operaes Bsicas Outras Operaes

Operaes de Criao/Destruio
Criao

void Create(HashTable &T) Create(

pr-condio: nenhuma prps-condio: tabela hash T criada e iniciada como psvazia


void Destroy(HashTable &T) Destroy(

Destruio

pr-condio: tabela hash T j tenha sido criada prps-condio: tabela T destruda ps-

Operaes de Status
Vazia

Operaes Bsicas
Insero

O tipo HashEntry depende da aplicao e pode variar desde um simples caracter ou nmero at uma struct ou class com muitos campos.

bool Empty(HashTable &T) Empty(

pr-condio: tabela hash j tenha sido criada prps-condio: funo retorna true se a tabela hash est vazia; false pscaso contrrio
bool Full(HashTable &T) Full(

Cheia

int Insert(HashTable &T, HashEntry k) Insert( pr-condio: tabela T j tenha sido criada e no est cheia prps-condio: O item k inserido na tabela, retornando a posio psonde k foi inserido int Search(HashTable &T, HashEntry k) Search( pr-condio: tabela T j tenha sido criada prps-condio: retorna a posio onde k se encontra ou zero caso pscontrrio bool Delete(HashTable &T, HashEntry k) Delete( pr-condio: tabela T j tenha sido criada prps-condio: O item k removido, retornando true se k estava na pstabela e false caso contrrio

Busca

pr-condio: tabela hash j tenha sido criada prps-condio: funo retorna true se a tabela hash est cheia; false pscaso contrrio
float LoadFactor(HashTable &T) LoadFactor(

Fator de Carga

Remoo

pr-condio: tabela hash j tenha sido criada prps-condio: funo retorna o fator de carga da tabela hash ps-

Outras Operaes
Limpeza

Desempenho
Busca com Sucesso
100 End. Encadeado Sondagem Linear Hash duplo

void Clear(HashTable &T) Clear(


log(Nmero Mdio de Comparaes)

pr-condio: tabela j tenha sido criada prps-condio: todos os itens da tabela so descartados e psela torna-se uma tabela hash vazia tornaint Size(HashTable &T) Size(

Tamanho

10

pr-condio: tabela j tenha sido criada prps-condio: funo retorna o nmero de elementos psem uso na tabela hash

1 0.1 0.25 0.5 Fator de Carga 0.75 0.9 0.99

Desempenho
Busca sem Sucesso
10000 End. Encadeado Sondagem Linear Hash duplo 1000 log(Nmero Mdio de Comparaes)

Desempenho
Por exemplo, se h 4096 ns em uma ABBB, toma-se em mdia 12.25 comparaes para tomacompletar uma busca com sucesso Usando uma tabela hash, com < 0.5, sero hash, necessrias 1.39 comparaes em mdia
Vetor Ordenado rvore B.B.B. Tabela Hash Busca O(log n) O(log n) O(1) Insero O(n) O(n log n) O(1) Remoo O(n) O(log n) O(1)

100

10

1 0.1 0.25 0.5 0.75 0.9 0.99

0.1 Fator de Carga

Sumrio
Tabelas hash armazenam uma coleo de registros com chaves O local de um novo registro depende do valor hash de sua chave Quando ocorre uma coliso, usado o prximo local disponvel Procurar por uma chave , geralmente, rpido. Quando um item removido, o local deve ser marcado de maneira especial, para que na busca se saiba que a clula j foi utilizada

Você também pode gostar