Hash Extensivel
Rápido acesso a dados com um
custo mínimo de processamento
(overhead cost).
• Introducao:
Os principais objetivos deste método são
pesquisa O(1) e tamanho variável
conforme a quantidade de contudo.
Hash extensível usa a chave gerada pela
função hash como uma pseudo-chave,
que será quebrada conforme
necessidade.
• Profundidade:
A profundidade deve ser tal que o numero
de baldes contenham todas as chaves, é
importante que a função hash distribua
bem as chaves.
Este número de baldes(B) corresponde a 2p
indices, assim p = log2 B. Onde B =
(numero de chaves)/(taxa de ocupacao).
Supondo ocupação máxima temos B =
(numero de chaves) / (tamanho do balde).
Inserção
• Inserção
• Após obtida a pseudo-chave a partir da chave da
informação a ser armazenada, pega-se os p bits mais
significativos da pseudo-chave (p se refere a
profundidade de diretório ou profundidade global) como
índice para acessar um posição do diretório.
• Por exemplo, se a pseudochave é 10100110 e a
profundidade do diretório é 3, acessaremos a posição
101. Nesta posição do diretório teremos uma referência
ao balde em que tentaremos inserir o dado( ou uma
referência a ele). Daí poderemos ter três casos:
• Melhor caso: há espaço no balde e a
pseudochave é simplesmente inserida no
balde
• Caso Intermediário . Não há espaço no
balde encontrado , mas ele pode ser divido
em mais um balde
A profundidade desse balde é menor que a
do diretório. Um novo balde é criado, e as
pseudochaves são redistribuídas entre o
novo balde e o original. A profundidade
local desses baldes serão iguais a
profundidade do balde original mais um.
• Pior caso: Não há espaço no balde
encontrado e a entrada do diretório
encontrada faz referência a um único
balde, ou seja, a profundidade local do
balde é igual a profundidade do diretório .
• O diretório dobra de tamanho e as
pseudochaves são distribuídos entre os
baldes do novo diretório.
Pesquisa
• A pesquisa no hash extensível é simples e
muito rápida. A chave de pesquisa passa
pela função hash retornando a
pseudochave. Se a profundidade do
diretório é p, os primeiros p bits da
pseudochave são usados para compor o
índice do diretório. Nesta posição temos a
referência ao balde onde faremos
pesquisa semelhante a feita num nó de
árvore B.
Remoção
• Após removermos a informação do balde,
temos que fazer duas verificações:
• 1- Se é possível fundi-lo com outro balde
(balde amigo).
• 2- Se o tamanho do diretório pode ser
reduzido.
Balde amigo
• Para a primeira verificação, temos que
achar o balde amigo. Para haver um único
balde amigo a profundidade do balde tem
que ser a mesma do diretório. Dado um
índice de um balde, o balde amigo é
aquele que difere apenas no último bit do
índice.
Redução de tamanho
• Isto é possível quando cada balde da
estrutura é referenciado por pelo menos
duas entrada do diretório.
• Ou seja, a profundidade de todos os
baldes é menor que a global .Assim o
diretório é reduzido pela metade ( a
profundidade decresce de 1) e as
referenciais aos baldes são refeitas.
Aplicações e Desemplenho
• Se o diretório de um hash podeser
mantido na memória RAM um simples
acesso é necessário para recuperar um
registro.
• Mas, se o diretório é tão grande que ele
precise ser mapeado fora da memória
RAM, dois acessos podem ser
necessários.
• Vantagens:
O tempo de acesso é completamente
independente do tamanho do arquivo.
Hash extensível não há necessidade da
ordenação dos dados no arquivo.
Tamanho tão grande quanto necessário(até
um limite definido pela função hash).
Desempenho
Quão grande deve ser um diretório para um
seterminado número de chaves?
A resposta foi dada por Frajolet em 1983:
Tamanho estimado do diretório = 3.92
r(1+1/b)/b.
Sendo r o número total de registros e b o
tamanho do balde.
Sobre o preenchimento dos baldes, esperase que os baldes estejam entre 0.53 e 0.94
cheios.
A análise de Fagin, Nievergelt, Pippenger e
Strong sugere que para um número r de
registros e um bloco de memória de
tamanho b, o número médio de blocos N é
aproximadamente:
N » r /(b ln 2)
A utilização é dada por: r / (b N) que é igual a
ln 2 = 0.69.
• Assim, esperamos uma utilização de 69%.
As árvores B tendem a ter uma utilização
de 67%, que pode ser aumentado para
85%, se distribuirmos as chaves durante a
inserção.
• Logo, uma árvore B tende a ocupar menos
memória, ao custo de se procurar mais
para se achar um dado.
Usos
• Hash extensível é usado quando temos
um grande número de informações que
estão em constantes mudança e elas têm
de ser acessadas rapidamente.
• Isso ocorre principalmente em sistemas
de arquivos de um sistema operacional e
sistemas de bancos de dados.
Download

Hash Extensivel