【问题标题】:What is the time complexity of getting first n largest elements in min heap?在最小堆中获取前 n 个最大元素的时间复杂度是多少?
【发布时间】:2015-05-20 12:14:47
【问题描述】:

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

How does heapq.nlargest work?

【问题讨论】:

    标签: python


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      对于 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)。

      【讨论】:

        猜你喜欢
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        相关资源
        最近更新 更多