我将一个简单的堆定义为列表列表。我使用 heapq 模块中的 heapop 来提取具有最小键的列表(我学到的是隐式内部列表的第一个元素)。但在下面的例子中,pop操作似乎给出了不寻常的结果。
有人可以解释原因吗?
heap = [[0,0,0],[inf,1,1],[inf,2,2],[5,3,3],[inf,4,4]]
heapq.heappop(堆)
[0,0,0]
heapq.heappop(堆)
[inf,1,1]
heapq.heappop(堆)
[5,3,3]
heapq.heappop(堆)
[inf,2,2]
heapq.heappop(堆)
[inf,4,4]
答案 0 :(得分:5)
问题是您在不是堆的列表上使用heapq。 documentation讨论了使用heapify命令,确实有效:
>>> import heapq
>>> from numpy import inf
>>> heap=[[0, 0, 0], [inf, 1, 1], [inf, 2, 2], [5, 3, 3], [inf, 4, 4]]
>>> heapq.heapify(heap)
>>> heap
[[0, 0, 0], [5, 3, 3], [inf, 2, 2], [inf, 1, 1], [inf, 4, 4]]
>>> heapq.heappop(heap)
[0, 0, 0]
>>> heapq.heappop(heap)
[5, 3, 3]
>>> heapq.heappop(heap)
[inf, 1, 1]
>>> heapq.heappop(heap)
[inf, 2, 2]
>>> heapq.heappop(heap)
[inf, 4, 4]