给定一个inorder-traversal列表,创建Binary Min / Max堆的最佳方法是什么?
我试图限制以下结构:
二进制堆中不使用任何数组。实现是基于节点的。
BinaryNode { value, parent, l_child, r_child }
让我们坚持使用Max-Heap。
问题:我们能否做到比涉及BubbleDown的标准插入做得更好。
答案 0 :(得分:3)
有一种优雅的线性时间算法,用于从一组值中构建最大堆,这种算法比仅执行n个冒泡步骤更快地渐进。我们的想法是建立一个较小的最大堆的森林,然后不断地将它们成对地合并在一起,直到所有元素都连接成一个最大堆。使用精确分析,可以证明该算法在O(n)时间内以非常好的常数因子运行。许多标准库包括此功能;例如,C ++具有std::make_heap
算法。
有关此算法的更多详细信息,包括算法草图,正确性证明和运行时分析,请查看之前的问题:https://stackoverflow.com/a/6300047/501557
希望这有帮助!