Hashing (Tabela de Dispersão) Prof. Alexandre Parra Carneiro da Silva
Hashing Teoricamente, técnicas de hashing permitem acesso dinâmico aos dados...
Transcript of Hashing Teoricamente, técnicas de hashing permitem acesso dinâmico aos dados...
Hashing
• Teoricamente, técnicas de hashing permitem acesso dinâmico aos dados (inserção/remoção/recuperação) numa complexidade que independe do número N de registros do arquivo O(1)
Hashing estático
- para arquivos que não variam de tamanho
Função de hashing
• Função que gera um endereço aleatório a partir de uma dada chave.
• Duas chaves podem definir dois endereços idênticos COLISÃO
h(k)h(k)
chavek = Adão
Registros
Adãoendereço 4
0
1
2
3
4
5
6
Exemplo simples
• 75 registros de nomes de pessoas devem ser armazenados num espaçode memória disponível para 1000 destes registros
função: transforme os dois primeiros caracteres dos nomes em inteiros, relativos a sua posição na tabela ASCII, multiplique estes valores e utilize os três dígitos menos significativos como endereço.
Nome ASCII das duas Produto Endereçoprimeiras letras
---------------------------------------------------------------------------------------------------------------BALL 66 65 66x65=4290 290LOWELL 76 79 76x79=6004 004TREE 84 82 84x82=6888 888
Colisões
• Funções de hashing devem gerar poucas colisões
Algumas ideias:
• distribuir o máximo possível os registros a serem armazenados, no arquivo, de tal formaque dois ou mais registros não sejam atribuídos a um mesmo endereço.
• considerar uma grande quantidade de espaço disponível (memória) em relação aonúmero de registros a serem armazenados (perda de espaço!!)
• associar mais de um registro a um único endereço (buckets)
Exemplo de um algoritmo de hashing
1. represente a chave numericamente2. subdivida-a e adicione os diferentes subconjuntos3. divida o resultado por um número primo (distribuição mais aleatória do resto) e use o resto da divisão como endereço.
Para LOWELL:
1. L O W E L L _ _ _ _ _ _ 76 79 87 69 76 76 32 32 32 32 32 32
2. | 76 79 | 87 69 | 76 76 | 32 32 | 32 32 | 32 32 | 7679 + 8769 + 7676 + 3232 + 3232 + 3232 = 33820
Para limitar o resultado a um valor máximo, x, e inserir mais aleatoriedade, podemos utilizar o operador mod:
Ex.: x = 19937 número primo distribuição mais aleatória do resto da divisão
Assim:
7679 + 8769 = 16448; 16448 mod 19937 = 1644816448 + 7676 = 24128; 24128 mod 19937 = 41874187+ 3232 = 7419; 7419 mod 19937 = 74197419 + 3232 = 10651; 10651 mod 19937 = 1065110651 + 3232 = 13883; 13883 mod 19937 = 13883
3. Objetivo: limitar a faixa de endereço resultante ao número de endereços disponíveis.
Seja s a soma obtida no passo 2 anterior e n o número de endereços disponíveis noarquivo. O endereço resultante, a, pode ser dado por:
a = s mod nque gera um valor entre 0 e n-1
Assim:
arquivo com 75 registros e n=101 endereços disponíveis: n = 101 primo !!!s = 13883 (LOWELL)
a = 13883 mod 101 = 84
75/101 = 0,743 = 74% do espaço utilizado84 LOWELL
int hash(char *v, int M) { int h = 0, a = 127 ; for (; *v != ‘\0’; v++) h = (a*h + *v) % M ; return ;}
Números primos e função de hashing
Funções de Hashing
abcdefg
12345678910
abcdefg
abcdefg
12345678910
12345678910
ideal (uniforme) ruim aceitável
Mais exemplos de funções
• “Mid-square”: transforma a chave num grande número decimal, eleva-oao quadrado e extrai dígitos do meio desta representação, proporcional aonúmero de casas decimais do maior endereço disponível
Ex.: endereços entre 0-99 chave = 341, 2chave = 116281
endereço da chave = 62
• Transformação de base: converte a representação numérica decimal dachave para outra base; calcula o mod deste resultado com o máximo ende-reço disponível.
Ex.: Endereços entre 0 – 99
453 chave10
382chave11 382 mod 100 = 82
)3( 0113
)8( 31141
)2( 4111453
resto
resto
resto
Conversão para a base 11:
Análise da distribuição dos registros no arquivo
• Calcula as diversas probabilidades de distribuição dos registros nos endereçosdisponíveis
• Baseia-se na distribuição de Poisson
!
)/()(
)/(
x
eNrxp
Nrx
Função de Poisson
!
)/()(
)/(
x
eNrxp
Nrx
Função de Poisson
N = número de endereços disponíveis
r = número total de registros a serem armazenados
x = número de registros atribuídos a um dado endereço
p(x) = probabilidade de a um dado endereço serem atribuídos x registros
com uma função de hashing sobre r registros.
Exemplo:
N = 1000 endereços disponíveis r = 1000 registros a serem armazenados
colisões) de adeprobabilid (grande 1N
r
• Probabilidade de um dado endereço receber x = 0 registro:
%79,363679,0!0
1)0(
10
e
p
• Probabilidade de um endereço receber x = 1 registro:
%79,363679,0!1
1)1(
11
e
p
• Probabilidade de um endereço receber x = 2 registros:
%4,18184,0!2
1)2(
12
e
p
• Probabilidade de um endereço receber x = 3 registros:
%1,6061,0!3
1)3(
13
e
p
Predições de colisão
Pela teoria das probabilidades temos que, para N endereços disponíveis,o número de endereços do arquivo contendo x registros é dado por:
)(xpN
Assim, para
N = r = 1000 r/N = 1
Podemos estimar o número de endereços com:
• x = 0 registro: 1000 x p(0) = 367,9 endereço sem registros
• x = 1 registro: 1000 x p(1) = 367,9 nenhuma colisão
• x = 2 registros: 1000 x p(2) = 183,9 183,9 registros com um sinônimo
• x = 3 registros: 1000 X p(3) = 61,3 61,3 registros com 2 sinônimos
(2 x 61,3 = 122,6 overflows)
Problema: Reduzir o número de colisões e tratar os casos de overflow !!
- Redução do número de colisões:
• boa função de hashing• uso de endereços extras
- Fator de carga D:
N
rD
sdisponívei endereços de número
registros de número
Exemplo:
%505.01000
500
N
rdo espaço utilizado no arquivo
Questões:
1- Para este fator de carga, quantos endereços ficarão sem registrosassociados?
607607.01000!0
)5.0(1000)0(
5.00
e
pN
2- Quantos endereços devem receber exatamente 1 registro?
303303.01000!1
)5.0(1000)1(
5.01
e
pN
3- Quantos endereços devem receber um registro mais um ou maissinônimos?
] ...)5()4()3()2([ ppppN0
= 1000[0.0758 + 0.0126 + 0.0016 + 0.002 + 0] = 90= 1000 – [607 + 303] = 90
4- Considerando-se apenas um registro/endereço, quantos overflows ocorrem no arquivo?
p(2) 1 overflowp(3) 2 overflowp(4) 3 overflows...
Nx1xp(2) + Nx2xp(3) + Nx3xp(4) + Nx4xp(5) + … = 1000 x [1x0.0758 + 2x0.0126 + 3x.0016 + 4x0.0002 + 0]= 107 overflows
5- Qual a porcentagem de overflows?
%4,21214,0500
107
Conclusão: Para um fator de carga igual a 50%, e cada endereço comum único registro, podemos obter 21% de todos os registros originandocolisões no arquivo.
Fator de carga (%) % de sinônimos10 4.820 9.430 13.640 17.650 21.460 24.870 28.180 31.290 34.1
100 36.8
Relação entre fator de carga e overflows
Redução de colisões por overflow progressivo
• Em casos de overflows, a lista de endereços é percorrida sequen-cialmente, até que uma área livre seja encontrada. Esta área repre-senta o endereço destino do registro.
NovakRosen
Jasper
Moreley
YORK
hash(YORK)
York
Procurando um registro que não existe:
Jello
.
.
.hash(Blue)
Blue
área vázia Blue não existeno arquivo
Se arquivo cheio, a busca sequencial retorna ao ponto de partida (ciclo completo) a busca se torna inviável!
Número Médio de Busca (NMB)
registros de totalnúmero
busca de totalnúmeroNMB
Chave Endereço
Adams 20
Bates 21
Cole 21
Dean 22
Evans 20
Exemplo:
Chave Endereço
Adams 20
Bates 21
Cole 21
Dean 22
Evans 20
Adams
Bates
Cole
Dean
Evans
20
21
22
23
24
número de busca
1
1
2
2
5
2.25
52211
NMB
NMB versus fator de carga para uma função de hashing com um registro porendereço e overflow progressivo empregado no caso de colisões
Fator de carga D
NMB
Abordagem de colisões por buckets
• Buckets: conjunto de registros associado a um mesmo endereço.
Green 30Hall 30Jenks 32King 33Land 33Marx 33Nutt 33
chave endereço
Green Hall
Jenks
King Land Marks
30
31
32
33Nutt é umoverflow
cada endereço pode conter 3 registros
Densidade de armazenamento por buckets
• Considera o número de endereços, N, e o número de registros,b, possíveis de serem armazenados em cada endereço (tamanho dosbuckets):
bN
rDB
Ex.:
r = 750N = 1000b = 1 750/1000 = 75%
r = 750N = 500b = 2 750/1000 = 75%
r/N = 0.75 r/N = 1.5
p(x) Sem buckets Com buckets(r/N=0.75) (r/N=1.5)
p(0) 0.472 0.223p(1) 0.354 0.335p(2) 0.133 0.251p(3) 0.033 0.126p(4) 0.006 0.047p(5) 0.001 0.014p(6) -- 0.004p(7) -- 0.001
Distribuição de Poisson para os dois tipos de arquivos
p(x) Sem buckets Com buckets(r/N=0.75) (r/N=1.5)
p(0) 0.472 0.223p(1) 0.354 0.335p(2) 0.133 0.251p(3) 0.033 0.126p(4) 0.006 0.047p(5) 0.001 0.014p(6) -- 0.004p(7) -- 0.001
Comparação de performance:
• Para o caso de b=1, r/N=0.75 e N = 1000, o número de overflows é:
1000 x [1xp(2) + 2xp(3) + 3xp(4) + 4xp(5) + 0 ] = 222 registros de overflow
222/750 = 29,6% de overflows
• Para o caso de b = 2, r/N = 1.5 e N = 500, o número de overflows é:
500 x [ 1xp(3) + 2xp(4) + 3xp(5) + 4xp(6) + 0 ] = 140 registros de overflow
140/750 = 18,7% de overflows
Fator decarga
Tamanho do bucket
Porcentagem de overflows
Overflow de registros em função de diferentes tamanhos de bucketse fator de carga
Supressão de registros
• a supressão não deve comprometer novas buscas.
• o espaço liberado deve poder ser reutilizado, por exemplo, no caso de um overflow progressivo
chaves hash(chaves) End. real
Adams 5 5Jones 6 6Morris 6 7Smith 5 8
Adams
Jones
Morris
Smith
4
5
6
7
8
chaves hash(chaves) End. real
Adams 5 5Jones 6 6Morris 6 7Smith 5 8
Adams
Jones
Morris
Smith
4
5
6
7
8
Apagando-se Morris
Adams
Jones
Smith
4
5
6
7
8
Smith está no arquivo?
Adams
Jones
########
Smith
4
5
6
7
8
observe que Smith não se encontra na melhor posição
após a supressão
Overflow progressivo encadeado
• Os sinônimos são encadeados a partir de apontadores
cada endereço contém um apontador para o próximo registro de
mesmo endereço
- vantagem: apenas os sinônimos são acessados numa determinada busca.
- desvantagem: temos campo de apontadores a mais; é preciso garantir a
busca correta aos sinônimos a partir do primeiro registro.
Exemplo 1: Overflow progressivo
Adams 20 20 1Bates 21 21 1Cole 20 22 3Dean 21 23 3Evans 24 24 1Flint 20 25 6
Chave hash(chave) End. real Comprimento de busca
NMB = (1 + 1 + 3 + 3 + 1 + 6)/6 = 2.5
- Overflow progressivo encadeadoAdams 22
Bates 23
Cole 25
Dean -1
Evans -1
Flint -1
20
21
22
23
24
25
NMB = (1 + 1 + 2 + 2 + 1 + 3)/6 = 1.7
Adams 20 Bates 21 Cole 20 Dean 22 Evans 24 Flint 20
Chave hash(chave)
- Overflow progressivo encadeadoAdams 22
Bates -1
Cole
Dean -1
Evans -1
Flint -1
20
21
22
23
24
25
Exemplo 2:
?
Área separada de overflow
• Objetivo: evitar que registros de overflow ocupem endereços errados.
Assim:
- área principal de dados contém registros com endereços “corretos”.
- área de overflow contém registros de overflows.
• Vantagens: os endereços da área principal de dados ficam livres para as novas adições de registros; o espaço no arquivo de overflow é alocado quando necessário; o processamento é simplificado
• Desvantagem: se overflow encontra-se em outro cilindro no disco maior tempode seek
Adams 0
Bates 1
Evans -1
20
21
22
23
24
Adams 20 Bates 21 Cole 20 Dean 21 Evans 24 Flint 20
Chave hash(chave)
Exemplo:
Cole 2
Dean -1
Flint -1
0
1
2
3
NMB = (1 + 1 + 2 + 2 + 1 + 3)/6 = 1.7
Tabela de Índices
• ideia: definir uma função de hashing que consulte um arquivo (tabela)de índices apontando para registros.
- Vantagem: a consulta aos índices se dá num único passo.
- Desvantagem: necessita de um acesso a mais na estrutura de hashing
h(K)
K
20
21
22
23
24
25
Adams Cole Flint -1
Bates Dean -1
Evans -1
Análise da frequência de aparição dos dados
• Baseia-se na frequência de ocorrência das chaves para decidir
quais devem ser armazenadas inicialmente no arquivo (aquelas de
maior fdp).
Bibliografia:
-- Michael J. Folk e Bill Zoellick. File Structures, Adisson-Wesley, 1992