在CLRS,第三版,第155页中,假定在MAX-HEAPIFY中,
子树的每个子树的大小最大为2n / 3-最坏的情况是树的底部恰好是一半满了。
我知道为什么当树的底部恰好是一半满时最糟糕。在此问题中还回答了MAX-HEAPIFY中的最坏情况:“最坏情况发生在树的底部恰好是一半满时”
我的问题是如何获得2n / 3?
为什么如果底层为半满,则子树的大小最大为2n / 3?
如何计算?
谢谢
在CLRS,第三版,第155页中,假定在MAX-HEAPIFY中,
子树的每个子树的大小最大为2n / 3-最坏的情况是树的底部恰好是一半满了。
我知道为什么当树的底部恰好是一半满时最糟糕。在此问题中还回答了MAX-HEAPIFY中的最坏情况:“最坏情况发生在树的底部恰好是一半满时”
我的问题是如何获得2n / 3?
为什么如果底层为半满,则子树的大小最大为2n / 3?
如何计算?
谢谢
Answers:
在每个节点上恰好有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。
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。
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
对于高度的完整二叉树h
,节点数为f(h) = 2^h - 1
。在以上情况下,我们有几乎完整的二叉树,下半部分已满。我们可以将其可视化为的集合root + left complete tree + right complete tree
。如果原始树的高度为h
,则left的高度为h - 1
and 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)
为了增加斯文的答案。当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
节点数-
从0级到n级的所有节点的求和,
根据几何级数求和规则,我们知道
代入x = 2,我们得到
由于2 ^(n + 1)是第n + 1级的总节点,因此可以说,具有0个孩子的节点数量比具有2个孩子的节点数量多1个。
现在让我们计算左子树,右树和总数中的节点数。
通过上述推理,左边的子树或根中的叶子节点数= k +1。由于树正好是半满,因此根的右子树中的非叶子节点数= k。
根的左子树中的节点总数= k + k + 1 = 2k +
这就是说孩子的子树的大小最大为2n / 3的原因。