优先级队列和最小/最大堆之间有什么区别?

时间:2018-02-14 20:52:40

标签: queue heap

我知道min和max堆是如何工作的,但是对于优先级队列是什么以及它如何不同而感到困惑。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

Priority queue是一种抽象数据类型(接口定义),它定义了三个操作: is_empty insert_with_priority pull_highest_priority_element 。该定义说明了这些功能应该做什么,但它并没有说明它是如何实现的。

binary heap是实现优先级队列的一种方法。它的优点是易于实施,并且效率相当高。它不一定是实现优先级队列的最有效方式(见下文)。虽然堆肯定是优先级队列,但优先级队列绝不是堆。

堆通常实现比优先级队列所需的功能更多的功能。例如,堆通常具有构造函数,可以非常快速地构建内部数据结构,而无需为每个项调用 insert 方法。堆也通常实现 peek 方法,它将返回第一个项目,而不删除它。这两个函数都不是优先级队列定义的一部分。

您可以使用简单的未排序列表实现优先级队列,但这样做效率不会特别高。与排序列表相同。您还可以使用平衡的二进制搜索树,它可以提供比列表更好的性能,但不如二进制堆好。

有许多优先级队列实现被称为"堆,"但它们与传统的二进制堆几乎没有共同之处。例如,Pairing heap在理论上比二进制堆更有效,Fibonacci heap也是如此。在实践中,配对堆 更有效,但Fibonacci堆不是。并且Brodal queue在理论上被证明是最有效的,但它实现起来很困难,并且在实践中比其他优先级队列实现慢得多。

您还可以使用Skip list实现优先级队列。我的经验是,跳过列表优先级队列的速度与二进制堆一样快,有时甚至更快。

优先级队列数据结构有许多不同的实现。您可以在https://en.wikipedia.org/wiki/Heap_(data_structure)#Variants找到部分列表。

答案 1 :(得分:2)

他们是同一件事,只是名字不同。

使用堆最有效地实现优先级队列,然后它是一个堆。有人可能会说我认为优先级队列可以用其他数据结构实现(效率较低)。

现实地说,我会说他们是一样的。

期待有人迂腐,说一个是抽象类型等等。