Esta resposta resume partes do TAoCP Vol 3, Ch 6.4.
Suponha que temos um conjunto de valores , dos quais queremos armazenar em uma matriz do tamanho . Empregamos uma função de hash ; tipicamente,. Chamamos o factor de carga de . Aqui, assumiremos o natural ; em cenários práticos, temos , porém, e tem que mapear até nós mesmos.n A m h : V → [ 0 .. M ) M ≪ | V | α = nVnAmh:V→[0..M)M≪|V| Am=Mm≪Mmα=nmAm=Mm≪Mm
A primeira observação é que, mesmo que tenha características uniformes¹, a probabilidade de dois valores terem o mesmo valor de hash é alta; este é essencialmente um exemplo do infame paradoxo do aniversário . Portanto, geralmente teremos que lidar com conflitos e podemos abandonar a esperança do pior caso de tempo de acesso.O ( 1 )hO(1)
Mas e o caso médio? Vamos supor que todas as chaves de ocorram com a mesma probabilidade. O número médio de entradas marcadas (pesquisa bem-sucedida) resp. (pesquisa malsucedida) depende do método de resolução de conflitos usado.C S n C U n[0..M)CSnCUn
Encadeamento
Cada entrada da matriz contém (um ponteiro para o início) uma lista vinculada. Essa é uma boa idéia, pois o tamanho esperado da lista é pequeno ( ), mesmo que a probabilidade de ter colisões seja alta. No final, obtemos
Isso pode ser melhorado um pouco, armazenando as listas (parcial ou completamente) dentro da tabela. C S n ≈1+αnm
CSn≈1+α2 and CUn≈1+α22.
Sondagem linear
Ao inserir (resp. Pesquisando um valor) , verifique as posições
nesta ordem até uma posição vazia (resp. ) for encontrado. A vantagem é que trabalhamos localmente e sem estruturas de dados secundárias; no entanto, o número médio de acessos diverge de :
Para , no entanto, o desempenho é comparável ao encadeamento².v
h(v),h(v)−1,…,0,m−1,…,h(v)+1
vα→1CSn≈12(1+11−α) and CUn≈12(1+(11−α)2).
α<0.75
Hashing Duplo
Semelhante a sondagem linear mas o tamanho do passo de pesquisa é controlada por uma segunda função hash que é coprime para . Nenhuma derivação formal é fornecida, mas observações empíricas sugerem
Este método foi adaptado por Brent; sua variante amortiza os custos de inserção com pesquisas mais baratas.M
CSn≈1αln(11−α) and CUn≈11−α.
Observe que a remoção de elementos e a extensão de tabelas tem graus variados de dificuldade para os respectivos métodos.
Bottom line, você tem que escolher uma implementação que se adapte bem aos seus casos de uso típicos. O tempo esperado de acesso em é possível se nem sempre garantido. Dependendo do método usado, manter baixo é essencial; você precisa trocar o tempo de acesso (esperado) versus a sobrecarga de espaço. Uma boa escolha para também é central, obviamente.O(1)αh
1] Como programadores desinformados arbitrariamente burros podem fornecer , qualquer suposição sobre sua qualidade é um exagero na prática.
2] Observe como isso coincide com as recomendações para o uso de Java .h
Hashtable