Eu sempre pensei que pilhas e filas de prioridade foram sinônimos - uma estrutura de dados abstrata que suporta os insert
, findMin
e deleteMin
operações.
Alguma literatura parece concordar comigo - Estruturas de Dados Puramente Funcionais de Chris Okasaki (capítulo 3), por exemplo.
Por outro lado, a página de heap da Wikipedia a define como uma estrutura de dados baseada em árvore e afirma que os heaps são uma implementação concreta de filas prioritárias.
Estou tendo uma grande dificuldade em conciliar isso com o fato de que posso pensar em mais de uma implementação de heap - pilhas esquerdistas, pilhas binomiais, pilhas espalhadas ...
O simples fato de um heap poder ser implementado com diferentes estruturas de dados não significa, por definição, que é uma estrutura de dados abstrata? E se for esse o caso, existe uma diferença real nas filas de prioridades?
fonte
Respostas:
Uma fila de prioridade pode ter qualquer implementação, como uma matriz que você pesquisa linearmente quando você pop. Tudo o que isso significa é que, quando você abre, obtém o valor com o mínimo ou o máximo dependendo.
Um heap clássico como normalmente é referido é geralmente um heap mínimo. Uma implementação que possui boa complexidade de tempo (
O(log n)
push e pop) e sem sobrecarga de memória.fonte
findMin
,deleteMin
,insert
), montes têm garantidas "boas" complexidades para eles, onde filas de prioridade não?O(log(n))
empurrão e pop, suponho.Este site fornece uma explicação muito clara. http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html
Em resumo, uma fila de prioridade pode ser implementada usando muitas das estruturas de dados que já estudamos (uma matriz, uma lista vinculada ou uma árvore de pesquisa binária). No entanto, essas estruturas de dados não fornecem as operações mais eficientes. Para tornar todas as operações muito eficientes, usaremos uma nova estrutura de dados chamada heap.
fonte
Eu acho que o que você escreveu sobre concreto vs abstrato está correto. Porém, onde você diz que pilhas de pilhas, pilhas de binômios são implementações diferentes de pilhas, acho que é mais correto dizer que são tipos diferentes de pilhas. Heap, penso que é uma categoria de implementação que geralmente garante não apenas a mesma interface, mas também os mesmos tempos de acesso.
Você vê isso com mapas associativos e tabelas de hash e árvores de pesquisa binária também. Bsts e tabelas de hash são estruturas de dados concretas que fornecem a interface abstrata do mapa associativo. Árvores negras vermelhas e árvores avl são ambas balsas equilibradas, com as mesmas grandes garantias de O e a mesma interface adicional (em ordem de travessia). São tipos diferentes de árvores, eu diria mais do que diferentes implementações de árvores. São implementações diferentes, mas intimamente relacionadas, de mapas associativos.
fonte