【问题标题】:Constructing Min/Max Binary Heap构建最小/最大二叉堆
【发布时间】:2023-03-16 04:41:01
【问题描述】:

给定一个中序遍历列表,创建二进制最小/最大堆的最佳方法是什么?

我试图限制以下结构:

  1. 二进制堆中没有要使用的数组。实现是基于节点的。 BinaryNode { value, parent, l_child, r_child }

  2. 让我们坚持使用 Max-Heap。

问题:我们能否比涉及 BubbleDown 的标准插入做得更好。

【问题讨论】:

  • 你假设堆是完全二叉树吗?或者这是任何服从堆属性的树?
  • “完全二叉树”,不是任何树。

标签: algorithm binary-heap min-heap max-heap


【解决方案1】:

有一种优雅的线性时间算法可以从一组值中构建一个最大堆,该算法比仅执行 n 个冒泡步骤要快得多。这个想法是建立一个由较小的最大堆组成的森林,然后不断地将它们成对地合并在一起,直到所有元素都连接到一个最大堆中。使用精确的分析,可以证明该算法在 O(n) 时间内以非常好的常数因子运行。许多标准库都包含此功能;例如,C++ 有std::make_heap 算法。

有关此算法的更多详细信息,包括算法草图、正确性证明和运行时分析,请查看之前的问题:https://stackoverflow.com/a/6300047/501557

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2018-09-21
    • 2012-05-26
    • 2019-12-29
    • 2018-10-22
    • 2012-11-28
    • 2022-11-15
    相关资源
    最近更新 更多