在构建堆时,我们max_heapify(A,i)从树的中间开始调用,即 floor(n/2),直到以递减方式的根来维护堆属性。我已经阅读了这背后的一些原因,但我仍然不明白为什么。请问,有人能解释一下原因吗?
谢谢你。
如果我们这样做,在最坏的情况下时间复杂度是线性的(证明的想法是观察当一个元素被向下筛选时,另一个元素向上移动,并且元素一旦向上移动就永远不会向下移动。因此,每片叶子下降的次数为零,叶子上一层的每个元素上升的次数最多为 1 次,依此类推。如果我们显式地计算这个总和,结果是O(N))。
如果我们从末尾开始向上筛选元素,则时间复杂度为O(N log N)(例如,如果数组反转)。
综上所述,这种方式效率更高。
注意:我们可以从最后一个元素开始,但是叶子无论如何都不会下降,所以它是无用的(尽管时间复杂度将保持线性)。