找到给定高度的n元素堆的节点数

时间:2012-01-11 05:55:04

标签: algorithm

我们在 Thomas H. Cormen 中遇到了一个要求展示的问题  enter image description here

在这里,我对这个问题感到困惑,即最多会有节点enter image description here

例如,考虑这个问题:    enter image description here

在高度2的上述问题中,有2个节点。但如果我们按公式计算:

Greatest Integer of  (10/2^2+1) = 4 

它不满足 Thomas H. Cormen 的问题。

如果我在这里错了,请纠正我。

提前致谢

10 个答案:

答案 0 :(得分:4)

在Tmh Corman 我发现他正在从1开始进行身高编号而不是0,所以公式是正确的,我做错了Interpration。所以叶子作为高度1和根有高度4为上面的问题

答案 1 :(得分:3)

看起来您的公式显示高度为h的 最多 [n / 2 ^ h + 1]个节点。在您的示例中,有两个高度为2的节点,小于计算出的最大值4(ish)。

答案 2 :(得分:2)

阅读所有答案,我意识到混淆来自高度的精确定义。在CLRS书的第153页中,高度定义如下:

  

将堆视为树,我们将堆中节点的高度定义为从节点到叶子的最长简单向下路径上的边数...

现在让我们看一下Nishant提供的原始堆。节点8,9,10,6和7处于高度0(即叶子)。节点4,5和3处于高度1.例如,节点5与其叶子之间存在一个边缘,节点10.此外,节点3与其叶节点6之间存在一条边。节点6看起来像是在高度1,但它在高度0,因此是一片叶子。节点2是高度为2的唯一节点。您可能想知道节点1(根)是远离节点6和7(叶子)的两个边缘,并且说节点1也是高度2.但是如果我们回头观察定义,粗体字“最长”表示从根到叶子的最长的简单向下路径有3条边(通过节点2)。最后,节点1处于高度3。

总之,在高度0,1,2,3处分别有5个,3个,1,1个节点。

让我们将该公式应用于我们在上段中所做的观察。我想指出,Nishant给出的公式是不正确的。

应该是 天花板(n / 2 ^(h + 1))没有天花板(n /(2 ^ h + 1)。对于可怕的格式化抱歉。我暂时无法发布图片。

无论如何,使用正确的公式,

h = 0,上限(10/2)= 5(节点8,9,10,6和7)
h = 1,上限(10/4)= 3(节点4,5和3)
h = 2,上限(10/8)= 2(节点2,但这没关系,因为公式预测高度2最多有2个节点。)
h = 3,上限(10/16)= 1(节点1)

正确定义身高,配方有效。

答案 3 :(得分:0)

在计算 Build-Max-Heap 的紧束缚时,作者在等式中使用了此属性。
在这种情况下,我们将帮助 Max-Heapify 称为 O(h ),其中h是以当前节点为根的子树的高度(不是节点本身相对于完整的树) 因此,如果我们考虑以叶节点为根的子树,它将具有高度0,并且该级别的树中的节点数最多为n / 2 0 +1 = n / 2(即对于从叶子处的节点形成的子树,h = 0) 类似地,对于以实际根为根的子树,树的高度将是log(n),并且在那种情况下,该级别的节点数将是1,即n / 2 logn +1的楼层= [n / n + 1]。

答案 4 :(得分:0)

的公式
no. of nodes = n/(2^(h+1)) 

所以当h2时,n = 10

no. of nodes = 10/(2^(2+1)) = 10/(2^3) = 10/8 = 1.25

但是

ceil of 10/8 = 2

因此,您可以从图中看到2个节点。

答案 5 :(得分:0)

虽然在Cormen中提到节点的高度是从节点到叶子的最大距离(边数),如果你将高度作为节点与叶子的距离,即在叶子的高度为零,根在高度为log(n)。公式是正确的。

叶子你有h = 0;因此通过公式n /(2 ^(h + 1)) H = 0;堆中的最大叶数为n / 2。

答案 6 :(得分:0)

高度1.科尔曼的理论给出10 /(2 ^(1 + 1))= 3(ceil),而高度1有4个节点。这是一个矛盾。

答案 7 :(得分:0)

Thomas H. Cormen 从一开始计算树的高度是不正确的,高度是 h = 0,1,...,log n 随着你的向上,它会增加:

enter image description here

并在下面的公式中,他加了1加上高度:

enter image description here

所有这些混乱都来自这样一个事实,即它可以很好地与 完美的二元树 一起使用,而不是你在问题中显示的那个,这就是为什么他是说 ON MOST

当你考虑Big-O时,它并不重要

答案 8 :(得分:-1)

这个公式是错误的,它在许多情况下给出了错误的答案,就像在这个问题中h = 1(即倒数第二级)它给出的最大节点数是3但是有4个节点。还让我们考虑一个有4个节点的树:

             a
            / \
           b   c
          /
         d

节点d的高度为0,让我们考虑使用公式n / 2 ^(h + 1)得到的高度= 1

4/2 ^(1 + 1)= 1

这意味着此级别最多只能有1个节点,这是假的!

所以这个公式不对。

答案 9 :(得分:-1)

公式非常正确。配方没有错! 让我们在Nishant提出的问题中占据树(尽管它还没有堆完整)。 因为h = 0意味着所有叶子都是ceil(10/2 ^(0 + 1)= 5)所以有5片叶子 对于h = 1表示所有具有一个弧到达叶子的节点,因此ceil(10/2 ^(1 + 1))= 3,树中有3个这样的节点。 对于h = 2意味着所有具有两个连续弧的节点到达叶子,因此ceil(10/2 ^(2 + 1))= 1所以你只有一个这样的节点(根的左后继) 对于h = 3表示所有具有三个弧的节点都离开,因此ceil(10/2 ^(3 + 1))= 1是根。

故事的道德是你在高度和水平之间感到困惑。等级从高到低开始。这意味着你在2级上有4个节点。如果从root开始并向下移动两个弧,你可以达到4个节点。 而高度完全不同。与上面的高度为0的情况一样,有5个节点(3级为3级,2级为2级)。因此,节点n的高度h表示可以到达叶子的弧线数量。

的问候,

希望澄清一点。

来自巴基斯坦的Safdar