从最小堆切换到最大堆而不重新排列内部数组

Posted

技术标签:

【中文标题】从最小堆切换到最大堆而不重新排列内部数组【英文标题】:Switching from min-heap to max-heap without rearrange the internal array 【发布时间】:2012-02-15 00:21:19 【问题描述】:

假设我们有一个最小堆,其中包含一些满足堆属性的元素。 如果我将算法从最小堆更改为 最大堆 而不重新排列内部数组会发生什么?

也就是说,如果我保持数组不变,当我将一个元素附加到内部数组时会发生什么?

【问题讨论】:

【参考方案1】:

考虑以下来自Wikipedia 的示例:

它的数组表示形式如下:

[1, 2, 3, 17, 19, 36, 7, 25, 100]

现在我们将堆从最小值“更改”为最大值,但不重新排列元素并插入一个新元素“25”。数组位置为 9,因此父节点在位置 4 处为“19”。

插入后,我们必须反复比较新项与其父项以确保堆属性(现在 max-heap => 父项必须大于子项)。因此,我们必须将“25”与“19”、“2”和“1”交换,直到它成为根节点。

现在 max-heap 属性适用于根节点(它的子节点确实更小),但不适用于其他节点,例如“3”仍然是“7”的父级,违反了最大堆条件。

总结一下:按照您的描述进行操作不会将最小堆更改为最大堆。

【讨论】:

【参考方案2】:

你只会搞砸堆。

你必须重新堆化(这可以在 O(N) 时间内完成)。

【讨论】:

以上是关于从最小堆切换到最大堆而不重新排列内部数组的主要内容,如果未能解决你的问题,请参考以下文章

浅析STL算法中的堆排序

算法试题 - 找出最小 k 个数

SPL数据结构2-Heap,最大堆,最小堆

Java数据结构与算法解析(十四)——二叉堆

Java数据结构与算法解析(十四)——二叉堆

动态数组第k小,Poj(1442)