Max-Heapify中最坏的情况-如何获得2n / 3?


81

在CLRS,第三版,第155页中,假定在MAX-HEAPIFY中,

子树的每个子树的大小最大为2n / 3-最坏的情况是树的底部恰好是一半满了。

我知道为什么当树的底部恰好是一半满时最糟糕。在此问题中还回答了MAX-HEAPIFY中的最坏情况:“最坏情况发生在树的底部恰好是一半满时”

我的问题是如何获得2n / 3?

为什么如果底层为半满,则子树的大小最大为2n / 3?

如何计算?

谢谢


5
此博客提供了一个简单的计算:bit.ly/138f43F
akaHuman13年

Answers:


65

在每个节点上恰好有0或2个子节点的树中,具有0个子节点的节点数比具有2个子节点的节点数多1。{说明:高度为h的节点数为2 ^ h,几何级数的求和公式等于(从0到h-1的节点总和)+1;并且从高度0到h-1的所有节点都是恰好具有2个子节点的节点}

    ROOT
  L      R
 / \    / \
/   \  /   \
-----  -----
*****

令k为R中的节点数。L中的节点数为k +(k + 1)= 2k +1。节点总数为n = 1 +(2k + 1)+ k = 3k + 2 (根加L加R)。比率为(2k +1)/(3k + 2),在上方以2/3限定。常数不能小于2/3,因为当k达到无穷大时的极限是2/3。


2
是的,我明白了,您的意思是说L / n = 2/3
Jackson Tale 2012年

7
哇。那很深。您是如何自行解决的?
编程Noob 2012年

37

Understand the maximum number of elements in a subtree happens for the left subtree of a tree that has the last level half full.Draw this on a piece of paper to realize this.

一旦清楚了,就很容易获得2N / 3的范围。

让我们假设树中的节点总数为N。

树中的节点数= 1 +(左子树中的节点数)+(右子树中的节点数)

对于我们的树,其最后一级为半满的情况,假设我们右子树的高度为h,然后左子树的高度为(h + 1):

左子树中的节点数= 1 + 2 + 4 + 8 .... 2 ^(h + 1)= 2 ^(h + 2)-1 .....(i)

右子树中的节点数= 1 + 2 + 4 + 8 .... 2 ^(h)= 2 ^(h + 1)-1 .....(ii)

因此,插入:

树中的节点数= 1 +(左子树中的节点数)+(右子树中的节点数)

=> N = 1 + (2^(h+2)-1) + (2^(h+1)-1)

=> N = 1 + 3*(2^(h+1)) - 2

=> N = 3*(2^(h+1)) -1

=> 2^(h+1) = (N + 1)/3

将这个值代入方程式(i),我们得到:

Number of nodes in Left Subtree = 2^(h+2)-1 = 2*(N+1)/3 -1 =(2N-1)/3 < (2N/3)

因此,对于具有N个节点的树,子树中最大节点数的上限为2N / 3。


我还是不明白 即使满了也不会发生,为什么它必须要满一半。有人解释-我很困惑。
桑达尔·拉詹

1
@SundarRajan检查math.stackexchange.com/questions/181022/…特别是部分This is the most the heap can get imbalanced; adding another node will either begin to rebalance the heap (by filling out the other, right, half of the last level) or break the heap's shape property of being a complete binary tree
momo

14

对于高度的完整二叉树h,节点数为f(h) = 2^h - 1。在以上情况下,我们有几乎完整的二叉树,下半部分已满。我们可以将其可视化为的集合root + left complete tree + right complete tree。如果原始树的高度为h,则left的高度为h - 1and right为h - 2。所以等式变成

n = 1 + f(h-1) + f(h-2) (1)

我们要解决以上f(h-1)表示为n

f(h-2) = 2^(h-2) - 1 = (2^(h-1)-1+1)/2 - 1 = (f(h-1) - 1)/2 (2)

在上面的(1)中使用

n = 1 + f(h-1) + (f(h-1) - 1)/2 = 1/2 + 3*f(h-1)/2

=> f(h-1) = 2*(n-1/2)/3

因此,O(2n / 3)


9
f(h)= 2 ^(h + 1)-1是不是?
a_fan 2013年

极好的答案。请更正@afnrf
Ajay

2

为了增加斯文的答案。当k趋于无穷大时(2k +1)/(3k + 2)趋于2/3

Lim_(k-> inf)(2k +1)/(3k + 2)= Lim_(k-> inf)k(2 +1 / k)/ k(3 + 2 / k)= Lim_(k-> inf )(2 + 1 / k)/(3 + 2 / k)

应用限制,您将获得2/3


2

节点数-

  • 级别0,即root是2 ^ 0
  • 1级是2 ^ 1
  • 2级是2 ^ 2
  • ...
  • 级别n为2 ^ n

从0级到n级的所有节点的求和,

  • S = 2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^ n

根据几何级数求和规则,我们知道

  • x ^ 0 + x ^ 1 + x ^ 2 + ... + x ^(n)=(x ^(n + 1)-1)/(x-1)

代入x = 2,我们得到

  • S = 2 ^(n + 1)-1.即2 ^(n + 1)= S + 1

由于2 ^(n + 1)是第n + 1级的总节点,因此可以说,具有0个孩子的节点数量比具有2个孩子的节点数量多1个。

现在让我们计算左子树,右树和总数中的节点数。

  • 假定根的左子树中的非叶节点数= k。
  • 通过上述推理,左边的子树或根中的叶子节点数= k +1。由于树正好是半满,因此根的右子树中的非叶子节点数= k。

  • 根的左子树中的节点总数= k + k + 1 = 2k +

  • 树中节点的总数,n =(2k +1)+ k +1 = 3k + 2。
  • 左子树中的节点数与总节点数之比=(2k +1)/(3k + 2),其上界为2/3。

这就是说孩子的子树的大小最大为2n / 3的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.