构造最小/最大二进制堆

时间:2011-12-26 09:13:17

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

给定一个inorder-traversal列表,创建Binary Min / Max堆的最佳方法是什么?

我试图限制以下结构:

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

希望这有帮助!