在CLRS,第三版,第155页,给出了MAX-HEAPIFY,
孩子的子树每个都有最大 2n / 3 - 最坏的情况 当树的底层正好是半满时发生。
我理解为什么当树的底层正好是半满时它是最糟糕的。此问题也回答worst case in MAX-HEAPIFY: "the worst case occurs when the bottom level of the tree is exactly half full"
我的问题是如何获得2n / 3?
为什么如果底层是半满的,那么子树的大小最多为2n / 3?
如何计算?
由于
答案 0 :(得分:51)
在每个节点中只有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。
答案 1 :(得分:34)
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 +(左子树中的节点数)+(右子树中的节点数)
对于树的最后一层半满的情况,iF我们假设右子树是高度h,那么左子树是高度(h + 1):
Left Subtree中的节点数= 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.
答案 2 :(得分:14)
对于高度为h
的完整二叉树树,节点数为f(h) = 2^h - 1
。在上面的例子中,我们有几乎完整的二叉树,下半部分已满。我们可以将其视为root + left complete tree + right complete tree
的集合。如果原始树的高度为h
,则左侧的高度为h - 1
,右侧为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)
答案 3 :(得分:2)
-
处的节点数从0级到n级的所有节点的总和,
从几何级数求和规则我们知道
代替x = 2,我们得到
由于2 ^(n + 1)是级别为n + 1的总节点,我们可以说0个子节点的节点数比有2个子节点的节点数多一个。
现在让我们计算左子树,右树和总数中的节点数。
通过上述推理,左子树中的叶节点数或 root = k + 1。 root = k的右子树中的非叶节点数,因为树被称为半满。
root子树中的节点总数= k + k + 1 = 2k +
这就是说孩子们的每个子树的大小最多为2n / 3的原因。
答案 4 :(得分:1)
添加到swen的答案。当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