我在维基百科上找到了min-max heap的主题。我想知道是否有任何方法可以在O(n)
中构建这个最小 - 最大堆。
我知道你可以用min heap和max heap来做到这一点,但是我不确定这会是什么方法。插入元素需要O(log n)
时间复杂度,我觉得这种树不能比O(n log n)
更有效地构建。
答案 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
是处于最低级别还是最高级别,并调用适当的方法TrickleDownMin
或TrickleDownMax
。