Académique Documents
Professionnel Documents
Culture Documents
Dados II
Aulas 8 e 9
1
Busca em tabelas
Busca Binária
● Acesso em O(log2N)
● Ainda muito lento se N é grande ((log21M)=20!
Uso de árvores B.
● Acesso em O(logkN), onde k é o tamanho da folha.
● Acesso bem melhor do que na busca seqüencial!
2
Busca em tabelas
3
Armazenamento em tabelas
Buckets
4
Acesso direto
5
Problemas com o acesso direto
6
Tabela de dispersão
hash(chave)
→[0...m − 1]
Note: m, não n !
7
Tabela de dispersão
10
Exemplo
11
Exemplo
Adicionado “Sparck”:
OK, h(Spark)=6
l Calcule h(Zé)=9
l Leia a posição 9, não há nada:
l Conclusão:
l Zé não está na tabela
12
Exemplo
Adicionado “Notes”:
Problema: h(Notes)=3
l h(Notes)=h(Steve)
l Colisão!!
l Há mais que 11 strings no mundo
l Com função hash uniforme, qual a
chance de colisão?
l Depende:
l tamanho da tabela
l quantas chaves devem ser
armazenadas.
13
Exemplo
Adicionado “Notes”:
Problema: h(Notes)=3
l h(Notes)=h(Steve)
l Colisão!!
l Várias formas de tratar colisões
l Onde armazenar e como
encontrar Notes e Steve agora.
l Importante:
l Colisões diminuem a eficiência.
14
Função de dispersão
Ser uniforme.
● Igual probabilidade de escolha para todos os buckets
15
Função de dispersão perfeita
17
Hash Function: Método da dobra
Suponha a chave como uma seqüência de dígitos escritos em
um pedaço de papel. O método consiste em “dobrar” esse
papel de maneira que os dígitos se superponham. Estes
devem ser somados, sem levar em consideração o “vai um”.
Suponha que os dígitos decimais da chave sejam d1,...,dk e que uma dobra
seja realizada após o j-ésimo dígito da esquerda.
Isto implica transformar a chave em d’1,..., d’j, d2j+1, ..., dk, onde d’i é o
dígito menos significativo da soma di+d2j-i+1,1 i j.
O processo é repetido. O número total de dobras e posição j de cada uma
devem ser definidos de forma que o resultado final contenha o número de
dígitos desejado para formar o endereço base.
Outra maneira de se ober um endereço base de k bits para uma chave
qualquer é separar a chave em diversos campos de k bits e operá-los com
o ou exclusivo. Há várias variações dependendo da chave.
18
Hash Function: Multiplicação
19
Hash Function: Aleatória x Uniforme
∑ i
( n
i =0
− n / 10 ) 2
Repita a análise para cada dígito e encontre os k melhores, isto é, aqueles que
possuem o menor desvio. O endereço base é obtido eliminando-se todos os
dígitos da chave, exceto os escolhidos entre os k melhores.
21
Memória extra para reduzir colisões
Fator de carga
(# registros armazenados)/(# de compartimentos) = r / m.
Medida da quantidade de memória ou espaço em disco que é
realmente usado.
Fórmula de Poisson
( r / m) x e − r / m
Vale para distr. aleatória p( x) =
x!
● Quantos compartimentos ficaram vazios = N p(0)
● Quantos compartimentos terão um registro = N p(1)
● Quantos compartimentos terão mais de um registro alocado = N [p(2) + p(3) + p(4) +
p(5)]. Para x 6, o valor é desprezível.
● Supondo um registro por compartimento, quantos registros fora do endereço base são
esperados = N [p(2) + 2p(3) + 3p(4) + 4p(5)]
Para p(2), um no compartimento e outro fora. Para p(3), um no
compartimento e dois fora. E assim por diante...
22
Efeito do fator de carga
Efeito do fator de carga na proporção de registros não armazenados
no endereço base, supondo um registro por compartimento.
Note: esse resultado não conta toda a estória, pois um registro fora do seu
endereço base pode ocupar o endereço base de outro registro, provocando outra
colisão no futuro! (Depende de como colisões são tratadas)
Efeito acumulativo
Colisões secundárias
Fator de carga (%) % de registros não armazenados
10 4,8
20 9,4
30 13,6
40 17,6
50 21,4
60 24,8
70 28,1
80 31,2
90 34,1
100 36,8
23
Tratamento de colisões
24
Encadeamento exterior
Consiste em manter m listas encadeadas, uma para cada
possível endereço base.
Campo de encadeamento deve ser acrescentado a cada registro.
Os registros correspondentes aos endereços base serão os nós
cabeça para essas listas.
Implementação: simples aplicação de lista encadeada.
25
Encadeamento exterior
O comprimento de uma lista encadeada pode ser O(N), logo esta é a
complexidade de pior caso.
No caso médio, entretanto, temos para uma função de dispersão
uniforme:
● Busca sem sucesso: número médio de comparações efetuadas é igual
ao fator de carga (α).
● Busca com sucesso: 1 + α/2 – 1/2m.
Desvantagem:
Espaço para ponteiros
26
Encadeamento interior
27
Encadeamento interior
28
Encadeamento interior - problemas
29
Busca por encadeamento interior
31
Remoção por encadeamento interior
busca(x, end, a)
se a = 1 então T[end].estado “liberado”
senão “exclusão inválida: chave não existente.”
32
Endereçamento aberto
O tratamento de colisões por encadeamento utiliza
listas encadeadas para armazenar chaves sinônimas.
Desperdício de espaço com ponteiros.
Solução: endereçamento aberto. As chaves sinônimas
são também armazenadas na tabela, sem qualquer
informação adicional.
Quando houver colisão, determina-se por cálculo qual
o próximo compartimento a ser examinado. Se ocorrer
nova colisão, um novo compartimento é escolhido por
cálculo, e assim por diante. A busca com sucesso se
encerra quando o compartimento for encontrado
contendo a chave procurada. A busca sem sucesso
ocorre quando o cálculo indica um compartimento
vazio ou a exaustão da tabela.
33
Endereçamento aberto - busca
A função de dispersão h(x) deve ser capaz de fornecer até m
endereços base.
Nova forma: h(x, k), onde k = 0,...,(m-1).
A seqüência de endereços base h(x, k), para k = 0,...,(m-1), é chamada de
seqüência de tentativas.
Mecanismo de busca
procedimento busca-aberto(x, end, a)
a = 3; k = 0;
enquanto k < m faça
end = h(x, k);
se T[h(x,k)].chave = x então
a = 1; k = m; % chave encontrada
senão se T[h(x,k)].chave = nil então
a = 2; k = m; % posição livre
senão k = k + 1
34
Endereçamento aberto - remoção
1 1 1
log +
α 1−α α
Como no caso do encadeamento interior, cada
compartimento da tabela deve ter três estados: vazio,
ocupado e liberado para permitir a remoção de elementos.
Liberado: marcador (tombstone) indica que
o registro já foi ocupado, e a busca deve continuar
35
Tentativa linear
37
Tentativa quadrática
38
Dispersão dupla
A seqüência de alternativas é calculada como:
h(x, k) = (h’(x)+ k h’’(x)) mod m, 0 <= k < m.
Esse método tende a distribuir as chaves na tabela de forma mais
conveniente que a tentativa linear ou a quadrática.
● Se x e y são duas chaves distintas tais que h’(x) = h’(y), então as
seqüências obtidas por esses métodos serão idênticas, o que
ocasiona a concentração de chaves em trechos da tabela.
● Na dispersão dupla, isso somente acontece se h’(x) = h’(y) e h’’(x) =
h’’(y) são idênticas.
● Também é capaz de gerar um maior número de tentativas distintas.
● Para que os endereços bases obtidos correspondam a varredura de
toda a tabela, é necessário que h’’(x) e m sejam primos entre si.
– Exemplo: m como potência de 2 e h’’(x) gerando números
ímpares ou, mais fácil ainda, m primo.
39
Tabela de dispersão dinâmica
41