Aula 23 - Frederico Brito Fernandes

Download Report

Transcript Aula 23 - Frederico Brito Fernandes

Tabelas Hash

Prof. Frederico Brito Fernandes [email protected]

CONTEÚDO (1) Auto-avaliação (2) Tabelas Hash (3) Tipos de funções hash (4) Colisão (5) Algoritmo de Cichelli (6) Conclusões

(1) Auto-avaliação Ordenação/Classificação

• Antes de prosseguir: – Considerando o vetor de inteiros a seguir, execute os algoritmos vistos na aula passada (quickSort e mergeSort), e escreva as alterações realizadas nesse vetor, em cada iteração realizada 4 8 3 vetor 2 1 7 iteração 1ª 2ª 3ª 4ª 5ª 6ª ...

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

2

Tabelas de dispersão/espalhamento (Hash Tables) (2) Hash

• Motivação: – Desejamos armazenar os dados referentes aos clientes de uma loja. – Cada cliente é individualmente identificado pelo seu nº de CPF (o CPF é a chave de busca). – Podemos então usar o nº de CPF como chave de busca de um cliente cadastrado no sistema.

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

3

(2) Hash Exemplo de aplicação

• Projetamos a tabela hash para que ela armazene entrada na forma (CPF, Nome), onde o CPF é um inteiro de 11 dígitos positivos • Nossa tabela hash usa um array de tamanho N = 100 e a função hash é h(k) = os últimos dois dígitos de k, onde k é chave de busca, i.e., o CPF • Como seria o cálculo realizado pela função hash?

Estrutura, Pesquisa e Ordenação de Dados 0 1 2 3 4 97 98 99

Frederico Brito Fernandes

   

02561200001 98110100002 Maria José 45122900004 João 20075199998 Ana 4

Exemplo de aplicação

• Uma função hash h mapeia chaves de um dado tipo para inteiros em um intervalo fixo de [0, N - 1], onde N é o tamanho da tabela • Exemplo: h(k) = k mod N é a função hash para chaves inteiras • O inteiro retornado pela função h(k) é chamado de valor hash da chave k 0 1 2 3 4   97 98 99  

02561200001 98110100002 Maria José 45122900004 João 20075199998 Ana (2) Hash

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

5

(2) Hash Definições

• Uma tabela hash para uma chave de um dado tipo consiste de – Uma função hash h – Um Array (chamado de tabela) de tamanho N • O objetivo é armazenar um registro/objeto/estrutura que possua chave de busca k na posição i = h(k) do array • E dispersar as chaves na tabela de forma aparentemente aleatória Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

6

Definições

• Não é apenas um método de pesquisa, mas também um método de organização física de tabelas; • o armazenamento de cada entrada da tabela é associado a um endereço calculado pela aplicação de uma função a chave de entrada; • a eficiência da pesquisa neste tipo de organização depende fundamentalmente da função de cálculo de endereço;

(2) Hash

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

7

(3) Tipos de funções hash Divisão

• Divisão – a função de hashing deve garantir que o nº por ela retornado seja um índice válido para uma entrada da tabela • H(c) = C mod 5 – Exemplo com 100 chaves para 5 entradas Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

8

(3) Tipos de funções hash Enlaçamento

• Enlaçamento – a chave é dividida em diversas partes. As partes são combinadas ( somadas por exemplo) para gerar o endereço alvo • Ex.: CPF= 123.456.789.22

– H(cpf) = 12+34+56+78+92+2 = 274 (total de endereços = 5 x 99 = 495 + 9 = 504 – H(cpf) = 123+456+789+22 = 1390 H(cpf) = cpf mod 1000 Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

9

(3) Tipos de funções hash Meio Quadrado

• Função meio-quadrado – a chave é elevada ao quadrado e parte dela é usada como endereço (os bits do centro) • H(16) = 0000 0001 0000 0000 = 256 0001 0000 = 16 • H(12) = 0000 0000 0110 0100 = 100 0000 1100 = 6 • 1.024 entradas – 10 bits Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

10

(3) Tipos de funções hash Extração

• Extração – apenas uma parte da chave é usada para gerar o endereço • Ex.: matrícula: 2010110256 período área ano – H(mat) = 0256 Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

11

(4) Colisão Nem tudo é perfeito...

• Voltando ao exemplo da motivação inicial, o problema que surge é que provavelmente existirão dois ou mais clientes da loja que apresentarão os últimos dois dígitos no nº de CPF iguais. • Dizemos que há uma colisão, pois registros/objetos/estruturas diferentes são mapeados para a mesma posição na tabela. • Vale salientar que não há como eliminar completamente a ocorrência de colisões em tabelas hash. Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

12

(4) Colisão Tratamento de colisão

• Devemos minimizar as colisões e usar um método que, mesmo com colisões, saibamos identificar cada elemento da tabela individualmente.

• Vale lembrar que uma tabela de dispersão nunca terá todos os elementos preenchidos • Uma ocupação acima de 75% eleva o número de colisões, descaracterizando a idéia central desta estrutura de dados • Portanto, podemos garantir que sempre existirá uma posição livre na tabela Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

13

(4) Colisão Tratamento de colisão

Encadeamento Separado

: cada célula na tabela aponta para uma lista encadeada de registros/objetos/estruturas • Encadeamento Separado é simples, mas requer memória adicional fora da tabela 0 1 2 3 4   

02561200001 Ana 45122900004 Zé 20075199904 Bia

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

14

(4) Colisão Tratamento de colisão

Sondagem Linear

: cada célula na tabela possui um ponteiro para o registro/objeto/estrutura que representa a informação armazenada na tabela de dispersão • Procuramos o próximo índice livre da tabela (usando incremento circular) para armazenar o novo elemento. • Os índices da tabela que não têm elementos associados são preenchidos com o valor NULL.

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

15

(4) Colisão Sondagem Linear

• O item que está colidindo é colocado em uma célula diferente da tabela • A sondagem linear lida com colisões colocando o item que colidiu na próxima célula disponível (circularmente) • Exemplo: – N = 13 – H(k) = k mod N – Insira as chaves 18, 41, 22, 44, 59, 32, 31, 73, nesta ordem – Na colisão, h’(k)=(h(k) +1) mod N 0 1 2 3 4 5 6 7 8 9 10 11 12 41 18 44593222 31 73 0 1 2 3 4 5 6 7 8 9 10 11 12 Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

16

Busca com Sondagem Linear

• get(

k

) – Sondamos posições consecutivas até que • Um item com chave

k

é encontrado, ou • Uma célula vazia é encontrada, ou • N células foram sondadas sem sucesso – Cada índice da tabela que tem um elemento associados é preenchido com o endereço do nó que contém o elemento

Algorithm get

(

k

)

i p

 

k mod N

0

do

c

if

c A

[ = 

i

]

return else if

null c->key

=

k

return

c->element

else while

i p

  (

i p p

!

=

N

+ + 1) mod 1

N

return

null

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

(4) Colisão 17

Atualizações com Sondagem Linear

• Para lidar com deleções, nós usamos ponteiros para null • remove(k) – Buscamos um item com chave k – Se este item for encontrado, substitua o ponteiro para o nó que continha o item por null e retorne o item – Caso contrário, retorne null • Inserções ou atualizações • put(k, object/struct/record) – Iniciamos na célula i = k mod N – Sondamos células consecutivas até que • Uma célula i encontrada esteja vazia (null) • Amazenamos o item (object/struct/record) na célula • Retorne true – Se N células foram sondadas sem sucesso então retorne false

(4) Colisão

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

18

Função hash perfeita

• Desenvolvido por Richard J. Cichelli para criação de funções hash perfeitas considerando um pequeno número de palavras:

(5) Cichelli

h(palavra) = ( comprimento(palavra) + g(primeiraLetra(palavra)) + g(ultimaLetra(palavra)) ) mod N

onde: a função g() deverá ser encontrada de forma exaustiva

Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

19

(5) Cichelli Função hash perfeita

O algoritmo possui 3 etapas: 1.

2.

• Frequência: Cálculo de ocorrências da primeira e última letra; • Ordenação: As palavras são ordenadas de forma decrescente; 3.

• • • • Busca: Tentativa de encontrar a função g() por meio de tentativas, colocando-se o valor de 0..MAX para cada letra; Os valores mapeados de h() são armazenados; Se para 0..MAX a colisão persiste, o algoritmo retrocede para a palavra anterior; Nem sempre a busca vai ser realizada com sucesso, ou seja, o algoritmo não garante que não haja colisões; Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

20

(5) Cichelli Função hash perfeita

Ex: N=9, MAX=4 Calliope, Clio, Erato, Euterpe, Melpomene, Polyhymnia, Terpsichore, Thalia e Urânia

1

Frequência: Estrutura, Pesquisa e Ordenação de Dados LETRA A C E M O P T U Nº de OCORRÊNCIAS 3 2 6 1 2 1 2 1

Frederico Brito Fernandes

21

(5) Cichelli Função hash perfeita

Ex: N=9, MAX=4 Calliope, Clio, Erato, Euterpe, Melpomene, Polyhymnia, Terpsichore, Thalia e Urânia

2

Ordenação: Estrutura, Pesquisa e Ordenação de Dados PALAVRA Calliope Clio Erato Euterpe Melpomene Polyhymnia Terpsichore Thalia Urânia Primeira + Última 2+6=8 2+2=4 6+2=8 6+6=12 1+6=7 1+3=4 2+6=8 2+3=5 1+3=4

Frederico Brito Fernandes

DECRESCENTE Euterpe Calliope Erato Terpsichore Melpomene Thalia Clio Polyhymnia Urânia

22

(5) Cichelli Função hash perfeita 3

Busca: PALAVRA Euterpe Calliope Erato Terpsichore Melpomene Thalia Clio Polyhymnia Urânia g() E=0 C=0 O=0 T=0 M=0 A=0 P=0 U=0 5 2 0 h() 7 8 6 4 1 6 (*) h() reservados [7] [7, 8] [5, 7, 8] [2, 5, 7, 8] [0, 2, 5, 7, 8] [0, 2, 5, 6, 7, 8] [0, 2, 4, 5, 6, 7, 8] [0, 1, 2, 4, 5, 6 , 7, 8] Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

COLISÃO: (1) Tentar U de 1..4; (2) Permanecendo, retroceder para palavra anterior

23

Função hash perfeita 3

Busca:

continuação

PALAVRA Polyhymnia Urânia Polyhymnia Urânia g() P=0 U=0 U=1 U=2 U=3 U=4 P=1 P=2 U=0 U=1 U=2 U=3 U=4 h() 1 6 (*) 7 (*) 8 (*) 0 (*) 1 (*) 2 (*) 3 6 (*) 7 (*) 8 (*) 0 (*) 1 Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

h() reservados [0, 1, 2, 4, 5, 6 , 7, 8] [0, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, 4, 5, 6, 7, 8]

(5) Cichelli 24

(6) Conclusões Eficiência da busca

• O pior caso ocorre quando todas as chaves inseridas colidirem • Neste caso, buscas, inserções e remoções tem tempo execução O(n) • Buscas, inserções e remoções em uma tabela hash bem projetada tem tempo de execução constante, i.e., O(1) • Aplicações práticas: – Bancos de dados pequenos – compiladores – Caches de browser (navegadores) Estrutura, Pesquisa e Ordenação de Dados

Frederico Brito Fernandes

25