Hashing usando árvores de pesquisa em vez de listas

11

Estou lutando com o hash e o material da árvore de pesquisa binária. E li que, em vez de usar listas para armazenar entradas com os mesmos valores de hash, também é possível usar árvores de pesquisa binária. E tento entender qual é o pior e o tempo médio de execução das operações

  1. insert,
  2. find e
  3. delete

vale a pena. caso médio. Eles melhoram com relação às listas?

Forrest Gump
fonte
Se você tiver acesso a uma análise rigorosa dos tempos de execução das tabelas de hash com encadeamento linear (ou seja, listas lineares), substitua a parte em que os custos médios nas listas lineares estão conectados aos resultados médios de caso de uma implementação equilibrada da árvore de pesquisa. O resto é mecânico. (Obviamente, isso ajuda.)
Raphael

Respostas:

4

Para listas, inserção, localização e exclusão estão respectivamente em , , . A lista ordenada é pior. A pesquisa binária em si é para matrizes classificadas, nas quais as operações estão em , , . Se você deseja operações de "inserção" e "exclusão", precisará de mais do que apenas pesquisa binária.O(1)O(n)O(n)O(n)O(logn)O(n)

Você provavelmente quer algo como árvores de pesquisa binária . É muito mais fácil encontrar referências sobre isso depois de ter a terminologia adequada. Essas operações estão em pior das hipóteses, por exemplo, para implementações usando árvores AVL e árvores preto-vermelho .O(logn)

jmad
fonte
1
Está tudo correto, mas não vejo como ela responde à pergunta.
Rrig # 10/12
Não era a mesma pergunta no momento. (Mesmo o histórico de edição não tem a pergunta original. Estranho.) Eu poderia atualizar minha resposta, mas ela se tornaria redundante com a de Gilles.
Jmad
4

Na pior das hipóteses, se você armazenar apenas elementos com os mesmos valores de hash, uma tabela de hash armazenará todos os elementos no mesmo bucket. Se você usar listas para armazenar os elementos de um bucket, a pesquisa será no pior caso (onde é o número de elementos na tabela - geralmente, é o número de elementos no maior bucket), porque você precisa percorrer a lista inteira se estiver procurando um elemento que não esteja na tabela. A pesquisa positiva (onde você sabe que o elemento está presente) tem a mesma complexidade: você precisa de se estiver pesquisando o último elemento da lista. A exclusão tem a mesma complexidade (você precisa deO(n)nnn1=Θ(n)n1pesquisas se você estiver excluindo o último elemento). A inserção também é se você precisar verificar um elemento existente ou se você permitir duplicatas (nesse caso, você pode inserir o elemento no início da lista).O(n)O(1)

Com as árvores de pesquisa binária balanceada , a complexidade do pior caso é reduzida para , porque a profundidade de uma árvore de pesquisa balanceada cresce logaritmicamente no tamanho da árvore, por definição de balanceamento.O(logn)

Com uma distribuição média de dados, os elementos são espalhados por diferentes buckets e há poucas colisões, portanto, a complexidade é próxima de independentemente da estrutura de dados usada em caso de colisão.O(1)

Com pesquisas aleatórias em uma distribuição de dados escolhida pelo adversário na qual todos os elementos estão no mesmo bloco, o comprimento médio da lista que deve ser percorrida é , portanto, a complexidade média da pesquisa nessa situação é . Com uma árvore, a média é , como no pior caso.nn/2Θ(n)Θ(logn)

Gilles 'SO- parar de ser mau'
fonte
2
"com distribuição média de dados" deve ler "com uma função hash suficientemente aleatória"
JeffE