Tabelas de dispersão
Colisões, fator de carga, sondagem e remoção sem interromper uma cadeia de pesquisa.
Ideia central
Uma tabela de dispersão localiza a chave pelo seu hash, sem manter ordem.
- Se duas chaves são iguais, os seus hashes são iguais. A recíproca é falsa: uma colisão não prova igualdade.
- Chaves em
[0,M)dispensam hash: o acesso direto custa com memória . - O hash comprime um universo grande em
mposições. Calcular o hash de uma string lê em geral os seus carateres: custa o comprimento da chave, não por defeito. Uma soma simples dos códigos, reduzida módulom, colide anagramas; serve para mostrar esse custo, não como hash recomendado. A lição usa uma combinação polinomial (Horner, base 31) para distribuir melhor. - A carga é , com
nchaves emmposições. Com dispersão uniforme e custo constante de hash e comparação (chaves de dimensão limitada), o encadeamento custa em média; se tudo colidir, degrada para .
Três estados da sondagem
Linear tenta . Apagar sem marcador parte a pesquisa.
| Encontra | Pesquisa | Inserção |
|---|---|---|
| Ocupada | Compara | Rejeita se igual |
| Tombstone | Passa à frente | Guarda para reutilizar |
| Livre | Termina com ausência | Fecha a procura de duplicado |
Limita a m passos. Só reutiliza a tombstone depois de excluir duplicado à frente.
Com m=7 e h(x)=x \bmod 7, as chaves 10, 17 e 24 ficam nas posições 3, 4 e 5. Apagar 17 deixa uma marca na posição 4; a pesquisa de 24 atravessa essa marca e encontra a chave na posição 5.
Não foi possível carregar a animação. Abre o vídeo ou acompanha a descrição abaixo.
Passo e reconstrução
- Linear agrupa. Quadrática pode não cobrir todas as posições.
- Duplo usa um passo coprimo com
m. Commprimo, qualquer passo com percorre a tabela; um múltiplo demnão serve, mesmo sendo não nulo como inteiro. - Rehash recalcula cada chave no novo tamanho. Copiar os índices antigos invalida a tabela.
unordered_settem custo médio constante e pior linear.reserve(n)reduz reconstruções, mas não as elimina em geral; rehash invalida iteradores.
