在CLRS的第三版第155页中,给出了MAX-HEAPIFY算法的实现:
"the worst case occurs when the bottom level of the tree is exactly half full"
我猜原因是在这种情况下,Max-Heapify必须通过左子树“向下漂浮”。
但我不明白的是“为什么是半满的”?
如果左子树只有一个叶子节点,Max-Heapify也可以向下漂浮。那么为什么不把这个情况考虑为最坏情况呢?
在CLRS的第三版第155页中,给出了MAX-HEAPIFY算法的实现:
"the worst case occurs when the bottom level of the tree is exactly half full"
我猜原因是在这种情况下,Max-Heapify必须通过左子树“向下漂浮”。
但我不明白的是“为什么是半满的”?
如果左子树只有一个叶子节点,Max-Heapify也可以向下漂浮。那么为什么不把这个情况考虑为最坏情况呢?
阅读整个上下文:
每个子树的大小最多为2n/3 - 最坏情况是树的最后一行正好半满
由于运行时间 T(n)
是通过树中元素的数量 (n
) 进行分析的,并且递归步骤进入其中一个子树,因此我们需要找到相对于 n
的子树节点数的上限,并且这将产生 T(n) = T(子树中的最大节点数) + O(1)
子树中节点数的最坏情况是当最后一行在一侧尽可能充满,在另一侧尽可能空置。这被称为半满。左子树大小将受到 2n/3
的限制。
如果您提出的情况只有几个节点,则无关紧要,因为所有基本情况都可以视为 O(1)
并忽略。
T(n) = T(s(n)) + O(1)
感兴趣,所以我们需要找到s(n) = subtree size as a function of n
的最坏情况。说我们正在“最大化子树的大小”是不正确的(我在与此问题相关的其他答案中看到过这种说法)- 我们真正最大化的是左右子树大小之比L/R
。 - rmorshea