插入二进制堆:最坏情况下的交换次数

时间:2014-05-10 11:52:05

标签: algorithm heap

我正在经历Cormen' Algorithms Unlocked'。在关于最短路径算法的第6章中,在将数据插入二进制堆中时,我发现:"由于到根的路径最多有一个(lg(n))边,最多一层(lg(n)) )-1交换发生,因此INSERT需要O(lg(n))时间。"现在,我知道在二进制堆中插入的复杂性如上所述,但是在最坏的情况下,交换的数量,如果它不是floor(lg(n))而不是floor(lg(n)) - 1 。这本书的勘误表没有说明这一点。所以我想知道我是否错过了什么。

谢谢和问候, 阿迪亚

2 个答案:

答案 0 :(得分:1)

您可以轻松地展示它floor(lg(n))。考虑这个二进制堆:

    3
  5  7

要插入值1,首先将其添加到堆的末尾:

    3
  5  7
1

所以堆中有4个项目。它将采用两次交换将项1移动到根目录。 floor(lg(4))等于2.

答案 1 :(得分:0)

floor(lg(n))是叶子和根之间路径上最大边数的正确表达式,当你进行交换时,最终可能会为每个边做一次交换。因此,对于最坏情况的掉期数量,floor(lg(n))是正确的答案。作者最有可能将路径上的边数与写入时路径上的VERTICES数混淆。如果在叶子和根之间的路径上有V个顶点,则V-1是边数,因此V-1是在最坏情况下可能进行的交换次数。