合并具有线性复杂度的堆数组

Posted

技术标签:

【中文标题】合并具有线性复杂度的堆数组【英文标题】:Merging heap arrays with linear complexity 【发布时间】:2013-10-09 10:43:54 【问题描述】:

如何将两个堆数组合并为一个平衡堆数组并仍保持线性复杂度?我读到的关于合并堆的大部分材料都需要 O(nlogn)。

【问题讨论】:

参见 cs.umd.edu/~meesh/351/mount/lectures/… 了解 BuildHeap 的分析,它在 O(n) 时间内将 n 个项目组织到一个堆中。因此,您只需构建一个新堆即可进行合并。 【参考方案1】:

有一个 O(n) 时间算法(有时称为“heapify”),给定 n 个总值,从这些值创建一个最大堆。 This earlier answer describes the algorithm and explains its runtime. 您可以使用此算法来合并两个最大堆,方法是创建一个新数组来存储这些最大堆中的所有值,然后应用 heapify 算法从它们中构造一个新堆。

不过,如果您知道自己会经常合并堆,那么还有比二叉堆更好的数据结构。例如,二项式堆、配对堆和倾斜堆都支持在 O(log n) 时间内进行融合。

希望这会有所帮助!

【讨论】:

【参考方案2】:

我们有两个大小为 N 的堆。每个堆都可以表示为一个数组See relation between parent and child。所以我们有两个堆排序的数组。我们需要通过将一个数组的所有元素添加到另一个数组的末尾来将这两个数组连接成一个数组。

所以现在我们有一个大小为 2N 的数组,但它不是堆排序的。为了使数组堆有序,它需要线性数量的比较,因此需要线性时间。 (参见自下而上的堆构建 - Order of building a heap in O(n))

【讨论】:

以上是关于合并具有线性复杂度的堆数组的主要内容,如果未能解决你的问题,请参考以下文章

合并 K 个排序数组/向量的复杂性

9.24 设计一个没有扩容负担的堆结构

时间复杂度最小的堆插入和删除

在算法复杂度比线性更好的列表中查找第一个偶数

具有最多和最少比较的堆排序输入

动态数组