二叉堆的所有用途
Posted
技术标签:
【中文标题】二叉堆的所有用途【英文标题】:All purpose of binary heap 【发布时间】:2017-05-18 08:40:27 【问题描述】:定义:
优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但其中每个元素都有一个与之关联的“优先级”。在优先级队列中,优先级高的元素先于优先级低的元素提供服务。如果两个元素具有相同的优先级,则按照它们在队列中的顺序提供服务。
实施:
实现优先队列、未排序数组、排序数组和二进制堆数据结构是3种实现策略。
具体来说,二叉堆的实现策略可以用array的keys来表示,
或
每个 key 作为 二元节点 有两个孩子。
问题:
除了优先级队列的实现,他们还有其他使用二叉堆数据结构的应用吗?
【问题讨论】:
另见堆排序。 并非如此。甚至可以说,堆排序只是填充优先级队列,然后按顺序拉出。二叉堆是一个优先队列。更重要的问题是优先级队列的应用是什么,哪些应用最好用二叉堆实现,哪些应该使用其他优先级队列实现。 1.请为您从中复制的来源提供正确的归属。见***.com/help/referencing。 2. 要求列出所有二进制堆的应用程序可能过于宽泛。 3. 你做过什么研究?您是否查看过数据结构教科书以了解它们如何处理堆? “不是。” - 对真的。 “可以说,即使堆排序也只是填充优先级队列,然后按顺序拉出。” - 没有有效地争论。 HeapSort 排序——这就是应用程序。它在内部使用堆是重言式。之所以使用 HeapSort,并不是因为它内部有堆,而是因为它的性能特点。见en.wikipedia.org/wiki/Introsort @JimBalter:我认为您是说 Heapsort 是一个单独的应用程序,因为“优先队列排序”不会那么快;堆的性能特征(特别是,能够就地重新排列数组以在 O(n) 中构建二进制堆)使得使用二进制堆优于仅使用任何旧的优先级队列。你说的是这个吗? 【参考方案1】:二叉堆可用于在 O(logn) 时间内提取(最大或最小)元素。可以利用此属性在许多算法中使用以获得更好的运行时间。
例如,我曾经在 k-merge 排序算法中使用它来提高 k-merge 排序的排序步骤的时间效率。简而言之,它把k-subarrays做成二进制堆,排序可以在线性时间内完成,比归并排序的一般排序步骤要好。
Dijkstra 算法、Prim 算法也使用它来减少它们的运行时间。
你也可以看看here
【讨论】:
您不能在恒定时间内从二进制堆中提取元素。 delete-min 是一个 O(log n) 操作。此外,OP 要求使用二进制堆而不是实现优先级队列。您的所有三个示例(合并排序、Dijkstra 算法、Prim 算法)都基于优先级队列。二进制堆只是一个方便的实现。 我更正了我的答案。感谢您指出。我试图列出二进制堆的少数用法。我没有谈论实施。如果您有任何不使用二叉堆作为优先级队列的情况,那么欢迎您发表评论。我会很高兴学习。 “提取(最大或最小)元素”——这实际上是优先级队列的定义,所以正如@JimMischel 指出的那样,您还没有回答这个问题。 “如果你有任何不使用二进制堆作为优先级队列的情况”——你倒退了。有几种方法可以在不使用堆的情况下实现优先级队列...... OP 提到了已排序和未排序的数组,还有许多其他方法。问题是二进制堆是否适用于其他任何事情。请参阅我的答案......一个实际的答案。编辑:我想也许你没有倒退,只是措辞不佳。 @JimBalter 我在您的回答中看到您建议 heapsort 作为二进制堆的一个很好的应用程序。所以你认为堆排序算法不使用从树中提取最小/最大元素的属性?不只是在内部使用二进制堆作为优先级队列吗?我不太明白你的意思。 @CODError "所以你认为堆排序算法不使用从树中提取最小/最大元素的属性?" ——不,我不这么认为。 “我不太明白你的意思”——我在 OP 问题下的评论中解释了这一点。提取最小值/最大值不是 原因 HeapSort 被使用......原因仅仅是它的性能特征。如果有人发现了一种具有相同性能特征的完全不同的算法,则可以使用它。【参考方案2】:二进制堆还有另一个有用的(主要的)应用:HeapSort。 HeapSort 的开销比 QuickSort 高,但最坏的情况是 O(n log n) 与 QuickSort 的 O(n*n)。一旦间隔足够短,可以通过切换到 HeapSort 来改进 QuickSort 以获得 O(n log n) 的最坏情况——这称为 IntroSort,并且在 STL 和 C++ 标准库中使用。见https://en.wikipedia.org/wiki/Introsort
【讨论】:
以上是关于二叉堆的所有用途的主要内容,如果未能解决你的问题,请参考以下文章