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