【问题标题】:How to build a Min-Max Heap in O(n) time complexity?如何在 O(n) 时间复杂度内构建 Min-Max Heap?
【发布时间】:2018-04-15 01:06:19
【问题描述】:

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

我知道你可以使用最小堆和最大堆来做到这一点,但我不确定这会是什么方法。插入元素需要O(log n) 的时间复杂度,我觉得这种树的构建效率无法比O(n log n) 高。

【问题讨论】:

  • 那篇维基百科文章表明您可以使用 Floyd 的 O(n) 算法来构建最小-最大堆。还有一些参考资料有助于解释为什么该算法是 O(n)。
  • 我真的很想理解这个算法,但是当我刚开始学习算法时,我很难理解,这就是为什么我希望在这里得到一些帮助。
  • 理解简单算法的最佳方法是使用铅笔和纸。在一些输入上尝试一下,您可能会看到它是如何工作的。 (这与堆排序算法中用于构建堆的方法相同,可能更容易解决。)

标签: algorithm minmax-heap


【解决方案1】:

是的,可以。在您的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

【讨论】:

  • TrickleDown(i) 确定我移动的位置的时间复杂度是多少。
  • @DHARMENDRASINGH TrickleDown(i) 的最坏情况时间复杂度为 O(log n)。但是在构建堆操作的上下文中,我们知道对TrickleDown 的最大调用次数是多少,以及复杂性是多少。见stackoverflow.com/q/49774237/56778
猜你喜欢
  • 2012-04-03
  • 2013-10-20
  • 2018-03-04
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多