实际上,使用重复调用构建堆
siftDown的复杂度为,
O(n)而使用重复调用构建堆
siftUp的复杂度为
O(nlogn)。
这是由于这样的事实,当您使用
siftDown时,每次调用所花费的时间 会 随着节点的深度而 减少
,因为这些节点更靠近叶子。当使用时
siftUp,交换的 数量 随节点的深度而 增加
,因为如果您处于最大深度,则可能必须一直交换到根。随着节点数量随树的深度呈指数增长,使用
siftUp给出了更昂贵的算法。
此外,如果您正在使用Max-
heap进行某种排序,请在其中弹出堆的max元素,然后对其进行重新堆砌,使用会更容易实现
siftDown。您可以
O(logn)通过弹出max元素,将最后一个元素放在根节点(由于弹出而为空)中,然后重新筛选到正确位置,从而及时重新堆砌。



