使用 heapq.heappop 弹出所有元素所需的时间复杂度 (Python 3)

Time complexity required to pop all elements using heapq.heappop (Python 3)

现在最初看起来应该是 O(Nlog(N)) ,其中 N 是堆中元素的数量,但是,假设最坏的情况,将需要 log(N) 时间来筛选每个元素,直到N/2 个节点被弹出(因为这意味着堆的高度减少了一个),然后需要 log(N)-1 时间来筛选每个元素,直到 N/4 个节点有被弹出
因此它变成了像

这样的系列

N/2*(log(N)) + N/4*(log(N)-1) + N/8*(log(N)-1) + ... N/(2^(log(N))*(log(N) - Height of Heap)


最后一项基本上是 N/N * 0 - 0

我无法算出这个级数的总和,我尝试将其积分为标准形式
N*(log(N) - x)/2^(x+1)dx 的积分,将 0 限制为 log(N)
但 wolfram 给了我一个复杂的答案

如果堆中有 n 项,则弹出根项的最坏情况复杂度为 log(n)。然后堆上有 n-1 个项目,弹出根项目的复杂度为 log(n-1)。所以你想要总结的系列是:

log(n) + log(n-1) + log(n-2) + log(n-3) + ... + log(n-n+1)

或者,更容易理解:

log(1) + log(2) + log(3) + ... + log(n)

解释了 O(n log n) 以及 Θ(n log n) 的原理。

或者,log(a) + log(b) 等于 log(a*b)。所以从1到n的对数之和等于log(n!)。参见 https://math.stackexchange.com/questions/589027/whats-the-formula-to-solve-summation-of-logarithms

另见 Is log(n!) = Θ(n·log(n))?