Escolar Documentos
Profissional Documentos
Cultura Documentos
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
[5]
506643543
[5]
506643543
[ 701] ...
[1]
[2]
[3]
[4]
[5]
[6] ...
[ 701]
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
4
[6] ... [ 701]
Number 155778322
[3]
Number 506643543
[4]
[5]
Number 506643543
[1]
[2]
Number 281942902
[3]
Number 506643543
[4]
[5]
Number 506643543
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
[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
Number 701466868
Number 701466868
[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
Number 701466868
Number 701466868
[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
Number 701466868
Number 701466868
[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.
[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
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 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
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
Operaes de Criao/Destruio
Criao
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.
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
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
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
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