Utilizando a função hash:
h(key) = key mod 11
Armazene os seguintes valores em sequência: 82,31,28,4,45,27,59,79,35
na tabela hash :
int table[11];
Realize as mesmas operações variando os seguintes métodos:
a. linear rehashing
b. quadratic rehashing
c. external chaining
d. coalesced chaining (cellar size=4 e hash function h(k)= k mod 7)
Para cada uma das estratégias de resolução de colisão
determine:
e. load factor
f. média do número de testes (probes) para encontrar valor presente
na tabela
Calculando a função h(k) = k % 11 para todos os valores da sequência temos :
key
|
82
|
31
|
28
|
4
|
45
|
27
|
59
|
79
|
35
|
h(key)
|
5
|
9
|
6
|
4
|
1
|
5
|
4
|
2
|
2
|
Observando a tabela acima haverá colisão apenas a partir da chave
27, que colidirá
com a chave 82 na posição 5 do vetor.
a. Utilizando linear probing para resolução de colisão
temos:
h'(k,i)=(k+a*i) mod 11, onde escolhemos a=1 e i>=1 variando iterativamente
a cada tentativa de se resolver a colisão.
h(27)=5 colisão h(82)
h'(27,1)=6 colisão h(28)
h'(27,2)=7 ok
h(59)=4 colisão h(4)
h'(59,1)=5 colisão h(82)
h'(59,2)=6 colisão h(28)
h'(59,3)=7 colisão h'(27)
h'(59,4)=8 ok
h(79)=2 ok
h(35)=2 colisão h(79)
h'(35,1)=3 ok
b. Utilizando quadratic probing para resolução de colisão
temos:
h'(k)=(k+a*i2) mod 11, onde escolhemos a=1 e i>=2 (pois i=1
recai em linear probing)
h(27)=5 colisão h(82)
h'(27,2)=9 colisão h(31)
h'(27,3)=3 ok
h(59)=4 colisão h(4)
h'(59,2)=8 ok
h(79)=2 ok
h(35)=2 colisão h(79)
h'(35,2)=6 colisão h(28)
h'(35,3)=0 ok
c. Utilizando external chaining para resolução de colisão
temos:
Cria-se uma lista ligada em cada posição do tabela hash.
idx[0] = NULL
idx[1] = 45 -> NULL
idx[2] = 79 -> 35 -> NULL
idx[3] = NULL
idx[4] = 4 -> 59 -> NULL
idx[5] = 82 -> 27 -> NULL
idx[6] = 28 -> NULL
idx[7] = NULL
idx[8] = NULL
idx[9] = 31 -> NULL
idx[10] = NULL
d. Utilizando coalesced chaining para resolução de colisão
temos:
Neste caso modificaremos a função básica de hash para
h(k) = k mod 7,
cujo efeito colateral será manter as 4 últimas posições
(4=11-7) do vetor
vazias para serem reaproveitadas na acomodação de colisões.
Também será necessário alocar um segundo vetor cuja finalidade
é indicar
qual o próximo índice do vetor original contém a resolução
da colisão.
idx[] é a tabela hash .: next[] indica próximo indíce
em idx[]
Obs: Todo o vetor next[] é inicializado com valor especial=VAZIO!
h(82)=5 .: h(31)=3 .: h(28)=0.: h(4)=4
h(45)=3 colisão com h(31)=3
como next[3] está vazio
escolhemos a última posição livre
idx[10]=45
e apontamos next[3]=10
h(27)=6 ok
h(59)=3 colisão com h(31)=3
como next[3]=10 utilizado para h(45)
escolhemos a posição livre idx[9]=59
e apontamos next[10]=9
Assim a sequência de resolução final é
h(59)=3->next[3]=10->next[10]=9
h(35)=0 colisão com h(28)
como next[0] está vazio
escolhemos a última posição livre idx[8]=35
e apontamos next[0]=8
e. Load Factor = numero de elementos na tabela / tamanho da tabela
Pela definição o load factor não depende do método.
Após a inserção da sequência de
9 elementos numa tabela de tamanho 11, o load factor será 9/11=0.81.
Isto significa que a tabela está 80% preenchida. Exceção
feita para o caso de
external chaining onde a definição de load factor não faz
sentido, uma vez que
o espaço de armazenamento cresce dinamicamente.
f. média do número de testes (probes) para encontrar valor
presente na tabela
Basta somar todas as linhas coloridas do texto acima para saber o total
de consultas.
Note que os valores que não sofreram colisão devem somar como
1 consulta para cada.
linear probing: 16 consultas / 9 valores = 1.777...
quadratic probing:14 consultas / 9 valores = 1.555...
external chaining:12 consultas / 9 valores = 1.333...
coalesced chaining:12 consultas / 9 valores = 1.333...