Tabelas de dispersão

Colisões, fator de carga, sondagem e remoção sem interromper uma cadeia de pesquisa.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

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 O(1)O(1) com memória Θ(M)\Theta(M).
  • O hash comprime um universo grande em m posições. Calcular o hash de uma string lê em geral os seus carateres: custa o comprimento da chave, não O(1)O(1) por defeito. Uma soma simples dos códigos, reduzida módulo m, 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 é α=n/m\alpha=n/m, com n chaves em m posições. Com dispersão uniforme e custo constante de hash e comparação (chaves de dimensão limitada), o encadeamento custa O(1+α)O(1+\alpha) em média; se tudo colidir, degrada para Θ(n)\Theta(n).

Três estados da sondagem

Linear tenta (h+i) mod m(h+i)\bmod m. Apagar sem marcador parte a pesquisa.

EncontraPesquisaInserção
OcupadaComparaRejeita se igual
TombstonePassa à frenteGuarda para reutilizar
LivreTermina com ausênciaFecha 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.

Pesquisar através de uma célula apagada. A pesquisa de 24 atravessa a posição apagada e encontra a chave em 5.

Passo e reconstrução

  • Linear agrupa. Quadrática pode não cobrir todas as posições.
  • Duplo usa um passo coprimo com m. Com m primo, qualquer passo com 1≤passo<m1\le passo<m percorre a tabela; um múltiplo de m não serve, mesmo sendo não nulo como inteiro.
  • Rehash recalcula cada chave no novo tamanho. Copiar os índices antigos invalida a tabela.
  • unordered_set tem custo médio constante e pior linear. reserve(n) reduz reconstruções, mas não as elimina em geral; rehash invalida iteradores.

Exemplo completo.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.