在Python中查看堆的内容

62

如何正式地查看由heapq库创建的Python堆的内容?目前我有以下代码:

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

这可能不是一个很好的方式,但我可以始终假设heap[0]是堆顶并使用它吗?或者那样做会过度假设底层实现?


是的,你可以使用 heap[0]。 - Shivangi Singh
2个回答

89

是的,你可以这样假设,因为在文档中已经说明了:

堆是指满足条件 heap[k] <= heap[2*k+1]heap[k] <= heap[2*k+2] 的数组,其中 k 从零开始计数。为了便于比较,认为不存在的元素是无穷大的。堆的一个有趣的特性是 heap[0] 总是它的最小元素。

(这可能是为什么没有 peek 函数的原因:根本没有必要。)


我找不到这个信息的原因可能是我拼错了peek。太好了! - Thomas
6
尽管正确拼写可能有所帮助,但我注意到这个词在文档中并没有出现,这很奇怪。 - Stephan202
1
我希望能够更进一步地解答这个问题,不仅 heap[0] 是最小的元素,heap[1] 是次小的元素,heap[2] 是第三小的元素,以此类推。 - BeeGee
8
@BeeGee那不是真的,也没必要是真的。你可以自己尝试一个简单的例子。 - Sнаđошƒаӽ

9
如果您使用的是Python 2.4或更高版本,您也可以使用heapq.nsmallest()函数。

3
在这种情况下,“n”是1吗? - WestCoastProjects
3
请务必检查您使用的 nsmallest() 的复杂度。在3.8中,我看到例如“在保持堆中k个最极端值的同时对数据进行单次遍历。”... 如果您只能使用 heap[0],则对于n=1来说并不理想。 - P Marecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接