organiza o e recupera o da informa o hashing n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Organização e Recuperação da Informação - Hashing PowerPoint Presentation
Download Presentation
Organização e Recuperação da Informação - Hashing

Loading in 2 Seconds...

play fullscreen
1 / 54

Organização e Recuperação da Informação - Hashing - PowerPoint PPT Presentation


  • 197 Views
  • Uploaded on

Organização e Recuperação da Informação - Hashing. Ednaldo Pizzolato. Hashing. Proposta

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Organização e Recuperação da Informação - Hashing' - hedy


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
hashing
Hashing
  • Proposta
    • Em lugar de organizarmos a tabela segundo o valor relativo de cada chave em relação às demais, a tabela hash leva em conta somente seu valor absoluto, interpretado como um valor numérico. Através de uma função conveniente, a chave é transformada em um endereço de uma tabela.
hashing1
Hashing
  • Princípio de Funcionamento
    • Suponha que existam n chaves a serem armazenadas em uma tabela T, seqüêncial e de dimensão m (i.e. [0..m-1]). Cada posição corresponde a um endereço e pode armazenar r nós distintos.
    • Obs.: quando a tabela se encontra em memória, é comum que cada endereço armazene um único nó. Já quando a tabela está em disco a organização pode ser diferente.
hashing2
Hashing
  • Acesso Direto
    • Quando possuímos uma tabela de tamanho m e o número de chaves é n, tal que n ≤ m e mais, cada chave x é armazenada na posição x da tabela, dizemos que x serve de índice para sua busca, e que o acesso à informação é direto.
hashing3
Hashing

chaves

01 03 00 02 05 04

Tabela

Problema ?

hashing4
Hashing

chaves

01 03 00 02 05 04

Tabela

Como seria o armazenamento

de chaves cujos valores esti-

vessem entre 1 e 999999?

hashing5
Hashing
  • Função Hash
    • Nem sempre as chaves estão no intervalo [0..m-1], mesmo sendo o número de chaves menor que m. Por isso, devemos transformar, de alguma forma, nossa chave x para um valor no intervalo [0..m-1]. A função h(x), qual que 0 ≤ h(x) ≤ m-1, responsável por esta transformação é chamada de função hash.
hashing6
Hashing
  • Colisão
    • Infelizmente, a função h(x) não pode garantir injetividade... Isso significa que podem existir chaves x e y (onde x≠y), tal que h(x) = h(y). Este fenômeno é chamado colisão. Dizemos que x e y são sinônimas em relação a h.
hashing7
Hashing
  • Custo
    • Pelo fato de não conhecermos profundamente a função h e, principalmente, não conhecermos previamente as chaves que serão inseridas em uma tabela, podemos apenas determinar limites inferiores e superiores para a complexidade da busca. Estes limites são O(1) (acesso direto) para o melhor caso, sendo o pior caso, porém O(n).
hashing8
Hashing
  • Propriedades da Função Hash
    • Produzir um número baixo de colisões;
    • Ser facilmente computável;
    • Ser uniforme (distribuição equilibrada de probabilidade)
hashing9
Caso 1 – Melhor caso.

A função hash é perfeita.

Hashing

1

2

3

4

5

6

7

8

9

10

A

B

C

D

E

F

G

hashing10
Caso 2 – Pior caso.

A função hash apresenta muitas colisões.

Hashing

1

2

3

4

5

6

7

8

9

10

A

B

C

D

E

F

G

hashing11
Caso 3 – Aceitável.

A função hash apresenta algumas colisões.

Hashing

1

2

3

4

5

6

7

8

9

10

A

B

C

D

E

F

G

hashing12
Hashing
  • Funções HASH
    • Método da divisão : divide-se a chave x pelo tamanho da tabela e o resto da divisão é usado como endereço-base.
      • H(x) = x % m
hashing13
Hashing
  • Funções HASH
    • Método da dobra (XOR) : Este método transforma uma chave de k bits (2k > m) em uma chave de j elementos, tal que 2j≤ m. Para isso pegamos os k/2 bits da esquerda e realizamos um XOR com os k/2 bits da direita, resultando em uma nova chave de k/s bits. Repetimos o processo até que a chave gerada tenha j bits.

Exemplo: m = 32, chaves de 10 bits (quanto vale j neste caso?)

71 = 00010 00111  00010 XOR 00111 = 00101 = 5

46 = 00001 01110  00001 XOR 01110 = 01111 = 15

hashing14
Hashing
  • Funções HASH
    • Método da análise de dígitos;
    • Método do meio do quadrado;
hashing15
Hashing
  • Tratamento de Colisão

Como já vimos, anteriormente, é impossível evitar que ocorram colisões. Um método para diminuir o número de colisões é diminuir o fator de carga da tabela, que é definido por

α = n/m

Essa preocupação deve ser tomada quando o número de colisões cresce rapidamente quando o fator de carga aumenta. No entanto, tal providência não é suficiente.

hashing16
Hashing
  • Encadeamento exterior

Cada endereço guarda um ponteiro para uma lista (inicialmente vazia). Cada entrada é colocada na posição final da fila referente a seu endereço. Algoritmos de inserção, remoção e busca são semelhantes aos de uma lista comum.

hashing17
Hashing
  • Encadeamento exterior

Custo médio de busca sem sucesso

Onde |Li| é o comprimento da fila i

hashing18
Hashing
  • Encadeamento exterior

Custo médio de busca com sucesso

hashing19
Hashing
  • Encadeamento interior

Em algumas aplicações, não é desejável a manutenção de uma estrutura exterior à tabela hash. Neste caso podemos implementar listas encadeadas, desde que estas compartilhem o mesmo espaço de memória da tabela hash. Desta forma, dividimos a tabela T em uma área de endereços, de tamanho p, e uma área de sinônimos, de tamanho s (s+p = m). Assim, a função h deve gerar valores em [0..p-1] e n/m deve ser menor ou igual a 1.

Problema ?

hashing20
Hashing
  • Encadeamento interior

Em algumas aplicações, não é desejável a manutenção de uma estrutura exterior à tabela hash. Neste caso podemos implementar listas encadeadas, desde que estas compartilhem o mesmo espaço de memória da tabela hash. Desta forma, dividimos a tabela T em uma área de endereços, de tamanho p, e uma área de sinônimos, de tamanho s (s+p = m). Assim, a função h deve gerar valores em [0..p-1] e n/m deve ser menor ou igual a 1.

Overflow

hashing21
Hashing
  • Encadeamento interior

Outra forma de utilizarmos o encadeamento interno é através da não reserva de nenhuma área para sinônimos. Esta técnica elimina a ocorrência de overflow (uma vez que n/m < 1), mas produz um efeito indesejado que é a possibilidade de colisão de duas chaves x e y onde h(x) ≠ h(y). Este tipo de colisão é chamado de colisão secundária.

hashing22
Hashing
  • Remoção

Outro problema sério em uma tabela hash é a remoção de uma chave. Neste método, sentiremos ainda mais os efeitos da eliminação de uma chave da tabela. Notem que não podemos simplesmente abrir um buraco na lista encadeada, o que criaria problemas (quais?). Como resolver?

hashing23
Hashing
  • Endereçamento aberto

Neste método, as colisões da tabela não são encadeadas como no método de encadeamento interior... Não há ponteiros. Quando houver alguma colisão, determina-se, através de uma nova função, qual o próximo endereço a ser examinado. Desta forma, teremos uma função h que leva em conta qual tentativa estamos realizando:

h(x,k)

onde k indica a k-ésima tentativa.

K = 0

hashing24
Hashing
  • Endereçamento aberto

Para encontrar a chave x, deve-se tentar o endereço-base h(x,0). Caso esteja ocupado por alguma outra chave, calcula-se o endereço h(x,1), e assim por diante, até que a chave seja encontrada ou h(x,k) aponte para uma posição vazia.

K = 1

hashing25
Hashing
  • Endereçamento aberto - remoção

A remoção de chaves da tabela exige cuidados especiais. No método do endereçamento aberto, a remoção apresenta um problema semelhante àquele do método do encadeamento interior. Uma chave não pode ser removida, de fato, da tabela, pois faria romper a seqüência de tentativas. A solução é semelhante à empregada no método anterior.

K = 2

hashing26
Hashing
  • Endereçamento aberto – tentativa linear

A idéia consiste em tentar armazenar a nova chave x no endereço-base h’(x). Se não for possível, tenta-se no endereço consecutivo h’(x) + 1. Se este já estiver ocupado, tenta-se h’(x) + 2... Até que uma posição vazia seja obtida ou ...(???) Lembre-se que devemos simular uma lista circular.

h(x,k) = (h’(x) + k) mod m

Problema : longos trechos consecutivos de memória ocupados, o que se denomina agrupamento primário.

hashing27
Hashing
  • Endereçamento aberto – tentativa quadrática

A idéia consiste em se obter seqüências de endereços distantes para endereços-base próximos. Para isso, utilizamos como incremento, uma função quadrática em k:

h(x,k) = (h’(x) + c1k + c2k2) mod m

Problema: Consegue evitar os agrupamentos primários da tentativa linear, mas não impede agrupamentos de chaves com mesma tentativa inicial. Os agrupamentos obtidos neste caso são chamados de secundários.

hashing28
Hashing
  • Endereçamento aberto – double hashing

O método calcula a seqüência de tentativas, de acordo com a seguinte equação:

h(x,k) = (h’(x) + k.h’’(x)) mod m

Esse método tende a distribuir as chaves na tabela de forma mais conveniente do que os dois anteriores. Se x e y são duas chaves distintas, tais que h’(x) = h’(y), então as seqüências de tentativas obtidas pelos métodos da tentativa linear e quadrática são necessariamente idênticas, o que ocasiona agrupamentos.

hashing31
Hashing
  • Abordagem Matemática

Quando projetamos uma tabela hash, devemos ter conhecimento estatístico prévio sobre alguns dados como:

a) prob. de um dado endereço não ser preenchido;

b) prob. de um dado endereço conter exatamente uma chave;

c) prob. de um dado endereço conter mais de uma chave.

hashing32
Hashing
  • Abordagem Matemática

A probabilidade de um evento ocorrer exatamente x vezes num total de r tentativas é dada por:

onde a é a probabilidade do evento ocorrer uma vez.

hashing33
Hashing
  • Abordagem Matemática

Quando relacionamos este tipo de evento a endereços em uma tabela hash, podemos dizer que a = 1/m, onde m é o tamanho da tabela. Desta forma, podemos calcular a probabilidade de um certo endereço conter x chaves em uma tabela com r chaves e tamanho m:

hashing34
Hashing
  • Abordagem Matemática

Entretanto, quando m e r são grandes, dizemso que p(x) tende a:

Que é conhecida como distribuição de Poisson.

hashing35
Hashing
  • Abordagem Matemática

Exemplo: Suponhamos que existam 1000 endereços (m=1000) e 500 chaves (r = 500). Se multiplicarmos 1000 pela probabilidade de um dado endereço conter x chaves associadas a si, teremos o valor esperado do número de endereços com x chaves (E(x)). Portanto, E(X) = m.p(x)

hashing36
Hashing
  • Abordagem Matemática

Com 1000 endereços (m=1000) e 500 chaves (r = 500). Quantos endereços devem estar desocu-pados?

R.: 607

hashing37
Hashing
  • Abordagem Matemática

Com 1000 endereços (m=1000) e 500 chaves (r = 500). Quantos endereços devem ter exatamente uma chave associada a si?

R.: 303

hashing38
Hashing
  • Abordagem Matemática

Com 1000 endereços (m=1000) e 500 chaves (r = 500). Quantos endereços devem ter mais de uma chave associada a si?

R.: 90  m [p(20 + p(3) + ... +p(m)]

= m. (1 – [p(0)+p(1)]) = 90

hashing39
Hashing
  • Abordagem Matemática

Com 1000 endereços (m=1000) e 500 chaves (r = 500). Assumindo uma chave por endereço, quanto de overflow pode ser esperado?

R.: 107  m [1.p(2) + 2.p(3) + ...]

O que indica 107 / 500 = 21.4%

hashing40
Hashing
  • Buckets para tabelas hash

Na maioria das vezes, quando estamos trabalhando com arquivos, o número de acessos ao disco é fator crítico ao invés do custo computacional. Além disso, sempre que recuperamos alguma informação do disco, não lemos apenas o número de bytes correspondentes à informação desejada, mas sim um bloco (ou mesmo um conjunto de blocos). O bucket é uma estrutura capas de armazenar o máximo de chaves que podem ser recuperadas com um único acesso a disco. Assim, cada endereço da tabela hash corresponderá a várias chaves.

hashing41
Hashing
  • Eficiência dos buckets

Quando tínhamos 1 chave por endereço, havíamos definido o fator de carga como sendo α = r / m, onde r é o número de chaves e m o tamanho da tabela. Agora, seja b o número de chaves por bucket:

hashing42
Hashing
  • Eficiência dos buckets

Quando armazenamos 750 chaves em 1.000 endereços de tamanho 1 temos:

hashing43
Hashing
  • Eficiência dos buckets

Quando armazenamos 750 chaves em 500 endereços de tamanho 2 temos:

hashing44
Hashing
  • Eficiência dos buckets

O cálculo do overflow para o caso 1 é:

m . [1.p(2) + 2.p(3) + 3.p(4) + ...] = 222

O mesmo cálculo para o caso 2 é

m. [1.p(3) + 2.p(4) + ...] = 140

Enquanto o primeiro caso obteve um valor esperado de 222 chaves em overflow (29,6%), o segundo caso obteve 140 chaves (18.6%). Buckets maiores diminuem ainda mais a porcentagem de overflow.

hashing46
Hashing
  • Extendible hashing

Arquivos que crescem ou diminuem muito rapidamente causam, em tabelas hash estáticas (como as que vimos até o presente momento), uma queda significativa de desempenho tanto pelo alto custo computacional gasto com overflow (tabelas pequenas) quanto pelo alto número de acessos a disco (tabelas maiores). O extendible hashing é um tipo de hashing dinâmico capaz de se ajustar a tabelas que crescem ou diminuem rapidamente, mantendo as características de acesso “direto” do hashing, sem perder desempenho (CPU e disco).

hashing47
Hashing
  • Extendible hashing

Definição : No extendible hashing, cada valor de h(x) é interpretado como uma seqüência de dígitos binários que servirão de índice para a busca da chave x. As chaves, por sua vez, serão armazenadas em buckets. Todas as chaves de um bucket possuem os i primeiros bits iguais, onde i é chamado de profundidade do bucket.

hashing48
Hashing
  • Exemplo

Suponhamos que haja um bucket A, cuja função h(x) tenha gerado valores iniciados pelos bits 01; um bucket B cujos bits iniciais sejam 10 e um bucket C com bits iniciais 11. Poderíamos representar esta situação em uma árvore como a seguinte:

A

0

B

0

1

C

1

hashing49
Hashing
  • Exemplo

Entretanto, uma estrutura de árvore não pode prover acesso “direto” que é o que desejamos. Desta forma, devemos mapear nossa “árvore” para uma outra árvore completa e depois, para um array, cujo acesso será direto:

00

A

0

01

B

10

0

1

11

C

1

hashing50
Hashing
  • Crescimento

00

A

01

B

10

11

C

hashing51
Hashing
  • Crescimento

A

00

D

01

B

10

11

C

hashing52
Hashing
  • Crescimento

00

A

01

B

10

11

C