Algoritmos/Estruturas de dados/Tabela Hash: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
→‎Buckets: Adicionar as fotos pendentes com as descrições e ajuste da página em geral.
Linha 50:
 
== Buckets ==
Para armazenar vários registros podemos pensar em usar Buckets que seriamconsistem em blocos (de vários registros). Trabalhar com Buckets é interessante, pois ele não armazena em um endereço um único registro, mas sim vários. Vamos supor, por exemplo, um registro de índice simples com 12 bytes (4 para o id e 8 para o endereço), assim temos que um setor no HD possui 4096 bytes que dividindo pelo índice fica 341,33 ou melhor 341 registros nesse setor. A busca desses registro é muito mais eficiente pois não precisaremos mais acessar o disco rígido, teremos todos os registros na memória principal.
[[Ficheiro:Bucket1.png|miniaturadaimagem|268x268px|Buckets]]
 
(Foto)
 
Como o Bucket funciona:
 
Temos vários registros param ser armazenados no Bucket, para isso utilizaremos uma função hash, para ver em qual endereço devemos armazenar aquele registro de índice. A inserção no Bucket é feita conforme há espaço nele, caso o Bucket o esteja cheio, devemos utilizar alguns tratamentos de colisões como:
 
# '''Encadeamento Interno'''
* Sondagem Linear
* Sondagem Quadrática
* Re-Hash
# '''Encadeamento Externo'''
* Área de extensão
* Lista encadeada
# '''Criação de um novo Bucket''' (Hash dinâmica)
 
== Hash Dinâmica ==
A vantagem da tabela hash dinâmica para a tabela hash estática é que podemos aumentar a dinâmica conforme precisamos, sem reposicionar TODOS os registros, que é o que acontece na tabela hash estática. O reposicionamento dos registros na tabela dinâmica é somente no Bucket que estiver estouradocheio, suaassim capacidadecriamos deum registrosnovo combucket oe realocamos os registros nesse novo Bucketbucket de forma que serátodos possam estar criado.
[[Ficheiro:Hash1.png|centro|miniaturadaimagem|360x360px|
 
Legenda
* p: profundidade global (diretorio)
* p’: profundidade local (bucket)
* n: número de elementos no bucket
(Fotos)
 
Vantagens do Hash Extensível
 
O diretório cresce sem precisar reposicionar todos os registros, somente os que foram afetados.
 
* p: profundidade global (diretorio)
A lista de Buckets aumenta de acordo com a necessidade.
 
* p’: profundidade local (bucket)
A consulta de Buckets é feita por meio de um ponteiro(rápido).
]]
Adicionar a chave numero 20:
[[Ficheiro:Hash2.png|centro|miniaturadaimagem|360x360px|Adicionando a chave 20]]
Como podemos ver a chave 20 não cabe no bucket(0) então devemos criar um novo bucket, aumentar as profundidades global e local (do bucket afetado), duplicar os endereços e fazer novas referencias.
[[Ficheiro:Hash3.png|centro|miniaturadaimagem|360x360px|Após os passos acima.]]
As chaves antigas do bucket(0) foram realocadas passando a usar uma nova função Hash, e dessa forma conseguimos inserir a chave 20, e faremos isso sempre que for preciso, dessa forma não teremos que realocar TODOS os registros mas somente os que forem afetados.
 
'''Vantagens do Hash Extensível'''
Com 2 acessos ao disco podemos recuperar todo nossos registros naquele bucket (acesso ao ponteiro do bucket e ao bucket).
# O diretório cresce sem precisar reposicionar todos os registros, somente os que foram afetados.
# A lista de Buckets aumenta de acordo com a necessidade.
# A consulta de Buckets é feita por meio de um ponteiro(rápido).
# Com 2 acessos ao disco podemos recuperar todo nossos registros naquele bucket (acesso ao ponteiro do bucket e ao bucket).