构建堆时,我们从树的中间开始调用max_heapify(A,i)
,即floor(n / 2),直到root以递减的方式来维护堆属性。我已经阅读了背后的一些原因,但我仍然不明白为什么。那么,有人可以解释其原因吗?
谢谢。
答案 0 :(得分:1)
如果我们这样做,时间复杂度在最坏的情况下是线性的(证明的想法是观察到当一个元素被向下筛选时,另一个元素向上移动并且元素一旦被移动就永远不会下降因此,每个叶子下降的次数为零,叶子上一级元素上升的时间最多为1,依此类推。如果我们明确地计算这个总和,那么结果是{ {1}}。
如果我们从结束开始并筛选元素,则时间复杂度为O(N))
(例如,如果数组反转)。
总而言之,这种方式更有效率。
注意:我们可以从最后一个元素开始,但是叶子永远不会失效,所以它将是无用的(虽然时间复杂度将保持线性)。