如何在O(n)时间复杂度中构建Min-Max堆?

时间:2017-11-02 13:24:34

标签: algorithm minmax-heap

我在维基百科上找到了min-max heap的主题。我想知道是否有任何方法可以在O(n)中构建这个最小 - 最大堆。

我知道你可以用min heap和max heap来做到这一点,但是我不确定这会是什么方法。插入元素需要O(log n)时间复杂度,我觉得这种树不能比O(n log n)更有效地构建。

1 个答案:

答案 0 :(得分:3)

是的,它可以。在 build-heap 循环中,只需调用TrickleDown,就像使用最小堆或最大堆一样。该功能将相应地移动项目,具体取决于它是在最低级别还是最高级别。

有关一般信息,请参阅原始论文Min-Max Heaps and Generalized Priority Queues。该文件没有实现 build-heap ,但是如果你自己编写调用TrickleDown的文件,它就会按预期工作。那就是:

for i = A.length/2 downto 0
    TrickleDown(i)

TrickleDown确定i是处于最低级别还是最高级别,并调用适当的方法TrickleDownMinTrickleDownMax