在最小堆中获得前n个最大元素的时间复杂度是多少?

时间:2015-03-17 21:09:29

标签: python

鉴于python中的heapq是python doc中指定的min heap,假设我有一个包含m个元素的heapq,调用nlargest的时间复杂度是多少?我不认为复杂性是O(n * lg(m)),因为只需弹出根并在最小堆中再次堆积只能让你最小化?

How does heapq.nlargest work?

2 个答案:

答案 0 :(得分:3)

您可以看到代码here。假设您执行heapq.nlargest(n, it),其中it是具有m元素的可迭代。 它首先使用n的第一个it元素构造一个最小堆。然后,对于其余的m-n元素,如果它们比根大,则将根取出,放入新元素,然后将其向下移动。最后,复杂性为O(log(n) * m)

答案 1 :(得分:0)

对于 heapq.nlargest(k, n),复杂度为 n + k*logn。

首先在 n 时间内堆化可迭代对象,然后弹出最顶部的元素(假设这是一个最大堆),并将堆向上筛选直到位置 0。这将花费 log n 时间。我们将重复这 k 次。所以这里的复杂度变成了 k * logn。

如果k很大,复杂度由后面的klogn决定,但是,对于较小的k值,复杂度由前面的O(n)决定。例如。 O(n + 3logn) 当 n 很大时变成 O(n)。