【发布时间】:2010-12-17 14:01:02
【问题描述】:
查看由 heapq 库创建的 python 堆的官方方法是什么?现在我有
def heappeak(heap):
smallest = heappop(heap)
heappush(heap, smallest)
return smallest
可以说,这不是很好。我可以一直假设heap[0] 是堆的顶部并使用它吗?还是会假设过多的底层实现?
【问题讨论】:
查看由 heapq 库创建的 python 堆的官方方法是什么?现在我有
def heappeak(heap):
smallest = heappop(heap)
heappush(heap, smallest)
return smallest
可以说,这不是很好。我可以一直假设heap[0] 是堆的顶部并使用它吗?还是会假设过多的底层实现?
【问题讨论】:
是的,你可以做这个假设,因为它在documentation:
堆是所有 k 的
heap[k] <= heap[2*k+1]和heap[k] <= heap[2*k+2]的数组,计数 从零开始的元素。为了 比较,不存在的元素是 被认为是无限的。 该 堆的有趣属性是heap[0]永远是最小的 元素。
(这可能是没有peek函数的原因:不需要它。)
【讨论】:
如果您使用的是 Python 2.4 或更新版本,您还可以使用 heapq.nsmallest()。
【讨论】:
nsmallest() 的复杂性。在 3.8 中,我看到例如“对数据进行一次传递,同时将 k 个最极端的值保留在堆中。” ... 不适合 n=1,如果您可以 heap[0]。