我知道,在将数字1,2,3,......,n
插入最初为空的最小堆(按顺序1,2,3,.....,n
)的情况下,您只需要将它们一一放置即可。
但是我还不太清楚如何计算两种不同情况的时间复杂度:如果您以相反的顺序(n,n-1,n-2,....,2,1)
插入它们,或者甚至以其他数字以该顺序(1,n+1,2,n+2,3,n+3,....,n-1,2n-1,n,2n)
插入。对于相反的情况,您将不得不沿插入堆的高度(即logn
)移动插入的数字,但是我不确定其余部分...
答案 0 :(得分:0)
正如您所说,当将数字0..n按顺序插入最小堆时,每个项的插入量为O(1)。因为您要做的就是将数字附加到数组中。
以相反的顺序插入时,每一项都将插入到最底行,并且必须从堆中筛选到根。每次插入都必须向上移动log(n)行。因此,每个项目的插入量为O(log n)。
平均,当您随机插入项目时,如Argument for O(1) average-case complexity of heap insertion和它链接的文章中所讨论的,大约是1.6。
所以有一个很强的论点,即二进制堆插入的平均复杂度为O(1)。
在您的特定情况下,您的插入是交替的O(1)和O(log n)。因此,随着时间的流逝,您将拥有O((1 + log n)/ 2),它将成为O(n log n)来插入所有项目。