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

Algorithm 插入二进制堆:最坏情况下的交换次数,algorithm,heap,Algorithm,Heap,我正在看科曼的“解锁算法”。在关于最短路径算法的第6章中,关于将数据插入二进制堆,我发现:“由于到根的路径最多有地板(lg(n))边,因此最多发生地板(lg(n))-1次交换,因此插入需要O(lg(n))时间。”现在,我知道在二进制堆中插入所产生的复杂性如前所述,但关于最坏情况下的交易所数量,不应该是地板(lg(n))而不是地板(lg(n))-1。这本书的勘误表没有提到这一点。所以我想知道我是否错过了什么 感谢和问候, Aditya(lg(n))是叶和根之间路径上最大边数的正确表达式,在进行交换

我正在看科曼的“解锁算法”。在关于最短路径算法的第6章中,关于将数据插入二进制堆,我发现:“由于到根的路径最多有地板(lg(n))边,因此最多发生地板(lg(n))-1次交换,因此插入需要O(lg(n))时间。”现在,我知道在二进制堆中插入所产生的复杂性如前所述,但关于最坏情况下的交易所数量,不应该是地板(lg(n))而不是地板(lg(n))-1。这本书的勘误表没有提到这一点。所以我想知道我是否错过了什么

感谢和问候,
Aditya(lg(n))是叶和根之间路径上最大边数的正确表达式,在进行交换时,可能会对每条边进行一次交换。因此,下限(lg(n))是最坏情况下互换数量的正确答案。作者在书写时很可能混淆了路径上的边数和路径上的顶点数。如果叶和根之间的路径上有V个顶点,那么V-1是边的数量,因此V-1是最坏情况下可能进行的交换的数量。

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

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

    3
  5  7
1

因此,堆中有4个项目。将项目
1
移动到根目录需要两次交换
floor(lg(4))
等于2。

我认为你是对的,但当你将一个元素附加到一个(排序的)列表中,并且新的长度是N时,这是一个非常小的错误,那么你最多需要N-1次交换才能将其冒泡到前面。@Henkholtman新的长度是floor(lg(N))+1。loor(lg(n))是edges的数量为什么不给他(或他的出版商)写信?这就是存在的勘误表是如何到达那里的。@Davidisenstat:在等待更多的答复之后,我正计划这样做,只是为了确保我没有遗漏一些明显的东西。