建造堆时从数组中间呼叫堆的原因

  • 本文关键字:呼叫 中间 数组 algorithm
  • 更新时间 :
  • 英文 :


构建堆时,我们开始从树中间调用 max_heapify(A,i),即地板(n/2),直到根部以减小的方式来维持堆质。我已经阅读了背后的一些原因,但我仍然不明白为什么。请有人解释一下吗?

谢谢。

如果我们这样做,那么时间复杂性在最坏的情况下是线性的(证据的想法是观察到,当元素被筛选时,另一个元素会向上移动和元素一旦上升,就永远无法下降。因此,每片叶子下降的次数为零,每个元素上方一个级别的时间数最多为1,依此类推。如果我们计算此总和明确地,事实证明为O(N))

如果我们从末端和筛选元素开始,则时间复杂度为 O(N log N)(例如,如果阵列被逆转)。

总结一下,这种方式更有效。

注意:我们本可以从上一个元素开始,但是无论如何,叶子永远都不会下降,因此它将没有用(尽管时间复杂性会保持线性的时间)。

如果我们从开始(或根节点)开始堆过程,这是错误的,因为堆的其余部分不是最大堆,所以我们不能保证根节点将是最高节点。

因此,我们从最后开始是有意义的。也就是说,自下而上的方法是有道理的。

但是,如果我们从末端开始,那意味着我们是从不会上升的叶子节点开始的(如果我们在调用叶子节点,则没有任何执行的效果)。因此,我们从叶子节点上方的一个级别开始,因此,从叶子节点上方到根节点上方的所有节点呼叫hepify。

叶子节点的父节点的索引不过是n/2-1,其中n是数组的大小。

我们可以轻松地计算出来:最后一个子节点或叶节点具有n -1的索引所以

c = n - 1

如果p是其父节点的索引然后

c = 2 * p + 1
p = (c - 1) / 2

替代

c = n - 1
p = (n - 2) / 2
p = n / 2 - 1

是N/2的地板

希望现在有意义!

最新更新