【发布时间】:2015-05-20 12:14:47
【问题描述】:
鉴于python中的heapq是python文档中指定的最小堆,假设我有一个包含m个元素的heapq,调用nlargest的时间复杂度是多少?我不认为复杂性是 O(n*lg(m)),因为简单地弹出根并在一个最小堆中再次堆化只会让你最小化?
【问题讨论】:
标签: python
鉴于python中的heapq是python文档中指定的最小堆,假设我有一个包含m个元素的heapq,调用nlargest的时间复杂度是多少?我不认为复杂性是 O(n*lg(m)),因为简单地弹出根并在一个最小堆中再次堆化只会让你最小化?
【问题讨论】:
标签: python
您可以看到代码here。假设您执行heapq.nlargest(n, it),其中it 是带有m 元素的可迭代对象。
它首先用it 的第一个n 元素构造一个最小堆。然后,对于其余的m-n 元素,如果它们大于根,则取出根,放入新元素,并将其向下移动。最后,复杂度是O(log(n) * m)。
【讨论】:
对于 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)。
【讨论】: