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

Algorithm 查找给定高度的n元素堆的节点数,algorithm,Algorithm,我们在《托马斯·H·科曼》(Thomas H.Cormen)一书中遇到了一个问题,要求展示 在这里,我被这样一个问题弄糊涂了:在大多数节点上会有什么 例如,考虑这个问题: 在上述高度为2的问题中,有2个节点。但如果我们用公式计算: Greatest Integer of (10/2^2+1) = 4 它不能满足托马斯·H·科曼的问题 如果我错了,请纠正我 提前感谢看起来您的公式说最多有[n/2^h+1]个高度为h的节点。在您的示例中,有两个高度为2的节点,这比您计算的可能最大值4(is

我们在《托马斯·H·科曼》(Thomas H.Cormen)一书中遇到了一个问题,要求展示

在这里,我被这样一个问题弄糊涂了:在大多数节点上会有什么

例如,考虑这个问题:

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

Greatest Integer of  (10/2^2+1) = 4 
它不能满足托马斯·H·科曼的问题

如果我错了,请纠正我


提前感谢

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

在Tmh Corman中我观察到他是从1而不是从0进行高度编号,因此公式是正确的,我的解释是错误的。因此,对于上述问题,叶的高度为1,根的高度为4。在计算构建最大堆的紧界限时,作者在等式中使用了此属性。
在这种情况下,我们调用helperMax Heapify,它取O(h),其中h是在当前节点扎根的子树的高度(而不是节点本身相对于完整树的高度)。
因此,如果我们考虑在叶节点根植的子树,它将具有高度0,并且树在该级别的节点的数目最多为N/20+1=N/2(即H=0,由叶子中的节点形成的子树)。 类似地,对于以实际根为根的子树,树的高度为log(n),在这种情况下,该级别的节点数为1,即n/2logn+1=[n/n+1]的楼层

no. of nodes = n/(2^(h+1)) 
所以当
h
2
,且
n=10

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


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

尽管Cormen中提到节点的高度是节点到叶子的最大距离(边的数量),但如果将高度作为节点到叶子的距离,即在叶子处高度为零,在根部高度为对数(n)。这个公式是正确的

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

高度1如何。Cormen的理论给出10/(2^(1+1))=3(ceil),而高度1处有4个节点。这是一个矛盾。

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

             a
            / \
           b   c
          /
         d

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

4/2^(1+1)=1

这意味着这个级别最多可以有1个节点,这是错误的


所以这个公式是不对的。

这个公式非常正确。这个公式没有问题!! 让我们以Nishant在顶部提出的问题中的树(尽管它还没有堆到它的完整部分)为例。 因为h=0意味着所有的叶子都有一层(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个节点。i、 e如果从根开始向下移动两个圆弧,则可以到达4个节点。 而身高则完全不同。与上述情况类似,在高度0处有5个节点(3个在标高3上,2个在标高2上)。因此,节点n的高度h表示可以到达一片叶子的弧数

问候,

希望它能澄清这一点


巴基斯坦的萨夫达尔阅读了所有的答案,我意识到困惑来自于对身高的精确定义。在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。但如果我们回顾一下定义,粗体字“longest”表示从根到叶的最长简单向下路径有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)


有了正确的高度定义,这个公式就起作用了。

托马斯·H·科曼(Thomas H.Cormen)不是从一开始计算树的高度,高度是H=0,1,…,log
             a
            / \
           b   c
          /
         d