如何将两个堆数组合并到一个平衡堆数组中并仍保持线性复杂度?我读到的关于合并堆的大部分材料需要O(nlogn)。
答案 0 :(得分:0)
有一个O(n)-time算法(有时称为“heapify”),给定n个总值,从这些值创建最大堆。 This earlier answer describes the algorithm and explains its runtime.您可以使用此算法合并两个max-sheaps,方法是创建一个新数组,存储来自这些max-sheaps的所有值,并应用heapify算法从中构造一个新堆。
如果你知道你经常合并堆,那么有比二进制堆更好的数据结构。例如,二项式堆,配对堆和倾斜堆都支持在O(log n)时间内进行融合。
希望这有帮助!
答案 1 :(得分:0)
我们给了两个大小为N的堆。每个堆都可以表示为数组See relation between parent and child。所以我们有两个堆排序的数组。我们需要通过将一个数组的所有元素添加到另一个数组的末尾来将这两个数组连接成一个数组。
所以现在我们有一个大小为2N的数组,但它不是堆排序的。为了使数组堆有序,它需要线性数量的比较,因此需要线性时间。 (参见自下而上的堆构造 - Order of building a heap in O(n))