heappop 的异常结果?
Unusual result from heappop?
我有一个定义为列表列表的简单堆。我正在使用 heapop 模块中的 heapq 来提取具有最小键的列表(我了解到它隐式地是内部列表的第一个元素) .但是在下面的例子中,弹出操作似乎给出了异常的结果。
有人可以解释为什么吗?
heap=[[0, 0, 0], [inf, 1, 1], [inf, 2, 2], [5, 3, 3], [inf, 4, 4]]
heapq.heappop(heap)
[0, 0, 0]
heapq.heappop(heap)
[inf, 1, 1]
heapq.heappop(heap)
[5, 3, 3]
heapq.heappop(heap)
[inf, 2, 2]
heapq.heappop(heap)
[inf, 4, 4]
问题是您在不是堆的列表上使用 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]
我有一个定义为列表列表的简单堆。我正在使用 heapop 模块中的 heapq 来提取具有最小键的列表(我了解到它隐式地是内部列表的第一个元素) .但是在下面的例子中,弹出操作似乎给出了异常的结果。
有人可以解释为什么吗?
heap=[[0, 0, 0], [inf, 1, 1], [inf, 2, 2], [5, 3, 3], [inf, 4, 4]]
heapq.heappop(heap)
[0, 0, 0]
heapq.heappop(heap)
[inf, 1, 1]
heapq.heappop(heap)
[5, 3, 3]
heapq.heappop(heap)
[inf, 2, 2]
heapq.heappop(heap)
[inf, 4, 4]
问题是您在不是堆的列表上使用 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]