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

时间:2012-02-01 16:05:54

标签: algorithm tree heap time-complexity

在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?

如何计算?

由于

5 个答案:

答案 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,即根是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个子节点的节点数多一个。

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

  • 假设root的左子树中的非叶节点数= k。
  • 通过上述推理,左子树中的叶节点数或 root = k + 1。 root = k的右子树中的非叶节点数,因为树被称为半满。

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

  • 树中的节点总数,n =(2k + 1)+ k + 1 = 3k + 2.
  • 左子树中的节点比率和总节点数=(2k + 1)/(3k + 2)以2/3为界。

这就是说孩子们的每个子树的大小最多为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