【问题标题】:Peeking in a heap in python在 python 中查看堆
【发布时间】:2010-12-17 14:01:02
【问题描述】:

查看由 heapq 库创建的 python 堆的官方方法是什么?现在我有

def heappeak(heap):
  smallest = heappop(heap)
  heappush(heap, smallest)
  return smallest

可以说,这不是很好。我可以一直假设heap[0] 是堆的顶部并使用它吗?还是会假设过多的底层实现?

【问题讨论】:

    标签: python heap peek


    【解决方案1】:

    是的,你可以做这个假设,因为它在documentation

    堆是所有 kheap[k] &lt;= heap[2*k+1]heap[k] <= heap[2*k+2] 的数组,计数 从零开始的元素。为了 比较,不存在的元素是 被认为是无限的。 该 堆的有趣属性是 heap[0] 永远是最小的 元素。

    (这可能是没有peek函数的原因:不需要它。)

    【讨论】:

    • 我找不到此信息的原因可能是我拼错了 peek。太好了!
    • 虽然拼写正确可能对你有帮助,但奇怪的是,文档中并没有出现这个词。
    • 我会把这个答案更进一步,说不仅 heap[0] 是最小的元素,heap[1] 是第二小的元素,heap[2] 是第三小的元素,等等
    • @BeeGee 这不是真的,也不需要是真的。您可以自己尝试一个简单的示例。
    【解决方案2】:

    如果您使用的是 Python 2.4 或更新版本,您还可以使用 heapq.nsmallest()。

    【讨论】:

    • 在这种情况下“n”是 1 吗?
    • 请务必检查您正在使用的nsmallest() 的复杂性。在 3.8 中,我看到例如“对数据进行一次传递,同时将 k 个最极端的值保留在堆中。” ... 不适合 n=1,如果您可以 heap[0]
    猜你喜欢
    • 2020-10-10
    • 2012-07-26
    • 2011-07-24
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2011-05-22
    相关资源
    最近更新 更多