堆和优先级队列之间的区别


36

我始终认为,堆和优先级队列是同义词-一个抽象的数据结构支持insertfindMindeleteMin操作。

一些文献似乎同意我的观点-例如克里斯·冈崎(Chris Okasaki)的“纯功能数据结构”(第3章)。

另一方面,维基百科的页面将其定义为基于树的数据结构,并指出堆是优先级队列的具体实现。

我很难与一个以上的堆实现实现这一点-左派堆,二项式堆,展开堆...

可以用不同的数据结构实现堆这一简单事实,从定义上来说并不意味着它是一种抽象的数据结构吗?如果是这样,优先级队列是否有实际差异?


11
阅读有关优先级队列的Wikipedia页面(en.wikipedia.org/wiki/Priority_queue),其中说:“可以使用堆或各种其他方法(例如无序数组)来实现优先级队列”,而这实际上就是答案。你的问题。
Doc Brown

2
好吧,不是真的-这并不能帮助我理解堆是具体的数据结构还是抽象的数据结构。我倾向于说一个抽象的,因为堆有许多具体的实现。如果是这种情况,并且优先级列表和堆都是具有相同属性的抽象数据结构,那么我需要帮助来理解不同之处,并且说一个可能是另一种的可能实现,如果两者都不是非常有用的话。具体实施。
Nicolas Rinaudo 2014年

情况甚至更糟:二进制堆可以实现为数组或二进制树。幸运的是,我还没有听说过实现其他形式的数组。
阿列克谢

Answers:


25

优先级队列可以有任何实现,例如在弹出时线性搜索的数组。它的全部意思是,当您弹出窗口时,将获得带有最小值或最大值的值。

典型的经典堆通常是最小堆。具有良好的时间复杂度(O(log n)按入和弹出)且没有内存开销的实现。


4
你的意思是说,不同的是,它们共享相同的操作(findMindeleteMininsert),堆保证了“好”的复杂性对他们来说,其中优先级队列不?
Nicolas Rinaudo 2014年

堆也不能具有具有不同时间复杂性的不同实现(例如,通常的链接二进制树)吗?同样,时间复杂度取决于所使用的内存。O(log(n))我想,如果是磁带,那就不会有推和弹出了。
Alexey '18

6

该网站提供了非常明确的解释。 http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html

简而言之,可以使用我们已经研究过的许多数据结构(数组,链表或二进制搜索树)实现优先级队列。但是,这些数据结构不能提供最有效的操作。为了使所有操作非常有效,我们将使用一种称为堆的新数据结构。


1
请注意,在您链接到的页面的摘要中,优先级队列本身称为数据结构
阿列克谢

2

我认为您写的关于具体与抽象的文章是正确的。尽管您说的是splay堆,但二项式堆是堆的不同实现,我认为说它们是不同类型的堆更正确。我认为堆是一类实现,它通常不仅保证相同的接口,而且保证相同的访问时间。

您会在关联映射,哈希表和二进制搜索树中看到这一点。Bst和哈希表都是提供关联映射抽象接口的具体数据结构。红黑树和avl树都是平衡的bst,具有相同的大O保证和相同的附加接口(顺序遍历)。它们是不同类型的树,而不是树的不同实现。它们是关联地图的不同但紧密相关的实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.