Hashing Estatico

13
Arquivos Diretos: Hashing Estático (Revisão) Prof. Kristian Magnani (Baseado em Folk 11.1, 11.2, 11.3.1-2, 11.4.1+poisson, 11.6.2) 2007 / 2 Atenção: A leitura destes slides não dispensa a leitura da bibliografia da disciplina.

Transcript of Hashing Estatico

Page 1: Hashing Estatico

Arquivos Diretos: Hashing

Estático (Revisão)

Prof. Kristian Magnani

(Baseado em Folk 11.1, 11.2, 11.3.1-2, 11.4.1+poisson, 11.6.2)

2007 / 2

Atenção: A leitura destes slides não dispensa a leitura da bibliografia da disciplina.

Page 2: Hashing Estatico

Hash

• Um tipo de indexação a custo O(1)

• hash (moer) - é uma função h(k) que transforma uma chave k em um endereço.

• O endereço retornado é usado como base para armazenar e recuperar registros.

• Diferenças do hash em relação à indexação:1.endereços gerados parecem ser aleatórios

(randomizing);

2.duas chaves distintas podem ser mapeadas em um mesmo endereço (colisão). Neste caso as chaves são ditas sinônimos.

Page 3: Hashing Estatico

Um primeiro exemplo

• 75 registros

• chave = nome da pessoa

• Espaço disponível para 1000 registros

• h(k) = pegar o código ASCII dos dois primeiros caracteres de k e multiplicar estes valores, e considerar apenas os últimos 3 dígitos.

Page 4: Hashing Estatico

Problemas:

• muitas colisões;

• combinações desperdiçadas (ex.: xz).

J | O | Ã | O 74 (J) * 79 (O) = 846

Page 5: Hashing Estatico

Hash perfeito

• Hash perfeito: h(k) que não gera colisões.

• Encontrar hash perfeito é um problema difícil. (ex.: 4000 registros, 5000 posições disponíveis, 1 em cada 10120.000 algoritmos [Hanson, 1982])

• Solução prática: reduzir o número de colisões a um nível aceitável:1. espalhar os registros (no exemplo, talvez usar mais

do que usar as duas primeiras letras);

2. usar mais memória (mais espaço disponível para colocar registros);

3. colocar mais de um registro em um mesmo endereço (buckets).

Page 6: Hashing Estatico

Um exemplo melhorado

• Passo 1: Representar a chave em forma de número.

• Passo 2: Separa e somar7479 + 6579 + 3232 + 3232 + 3232 + 3232 = 26986

Atenção: cuidado com overflow! (escolher um limite superior e a cada etapa da soma, tomar o resto da divisão por este limite.)

J | O | A | O | | | | | | | |

74 79 65 79 32 32 32 32 32 32 32 32

Page 7: Hashing Estatico

Ex.: limite superior = 19937 (primo)(7479 + 6579) % 19937 = 14058

(14058 + 3232) % 19937 = 17290

(17290 + 3232) % 19937 = 585

(585 + 3232) % 19937 = 3817

(3817 + 3232) % 19937 = 7049

• Passo 3: Dividir pelo tamanho do espaço de endereçamento e tomar o resto

endereço = soma % tamanho

(Se possível, escolher tamanho primo.)

Tamanho = 101 → 7049 % 101 = 80→ h(JOAO) = 80

Page 8: Hashing Estatico

Distribuição de registros

1

A 2

B 3

C 4

D 5

6

Melhor caso(uniforme)

1

A 2

B 3

C 4

D 5

6

Pior caso

1

A 2

B 3

C 4

D 5

6

Aceitável(poucos sinônimos)

Page 9: Hashing Estatico

Algumas táticas de hashing

(Deve-se sempre considerar as características do conjunto de chaves caso-a-caso.)

1. Examinar as chaves e encontrar um padrão útil (ex.: no matrícula)

2. Juntar as partes de uma chave (ex.: separar em pedaços e somar)

3. Dividir por um número (primo) e usar o resto da divisão

4. Elevar chave ao quadrado e pegar o meio (ex.: 453 → 4532 = 205209 → 52 (0 a 99))

5. Transformação de base (radix) (ex.: 453, de 0 a 98 → 45310 = 38211 → 38210 % 9910 = 85)

Page 10: Hashing Estatico

Estimando o número de colisões

• p(x) = função de Poisson = probabilidade de um endereço qualquer receber x registros

p(x) = ((r/N)x . e(-r/N))/x!

onde:

• r = no. de registros a serem armazenados

• N = no. de endereços disponíveis

• x = no. registros atribuídos a um mesmo endereço

Page 11: Hashing Estatico

Densidade de empacotamento

• densidade

= no de registros / no de endereços

= r / N

• Se couber mais de um registro por endereço:

densidade = r / (b . N), onde b = no de registros

por endereço

Page 12: Hashing Estatico

Detalhes de implementação

• Arquivos que usam hash são baseados em

registros de largura fixa, ou em buckets de

largura fixa.

• Como h(k) não muda para uma chave k,

operações de adicionar, remover ou modificar

registros devem acontecer sem quebrar o

vínculo entre k e o endereço do registro cuja

chave é k.

• Registros livres devem ser marcados como tal.

Page 13: Hashing Estatico

• Arquivo geralmente é alocado de uma vez,

preenchidos com espaço ou outro caracter.

(Isso geralmente garante que registros ficarão

fisicamente próximos no disco, otimizando o

acesso).

• Tomar cuidado com tentativas de inserir uma

chave que já existe.

• Gerenciar o no de registros em cada bucket.

0| | | | |

2|JOAO |ANTONIO | | |

5|MARIA |JOSE |MARTA |PEDRO |ANA

3|PRISCILA |FATIMA |SANDRA | |

0000

0501

1002

1503

1 byte

100 bytes 100 bytes 100 bytes 100 bytes 100 bytes