Python 的 heapq 库管理的项的顺序是如何确定的?
How is the order of items managed by Python's heapq library determined?
我的印象是第一个值决定了堆中的值位置,但事实并非如此。
from __future__ import print_function
import heapq
q = []
heapq.heappush(q, (10, 11))
heapq.heappush(q, (11, 12))
heapq.heappush(q, (9, 10))
print(q)
这给了我
的输出
[(9, 10), (11, 12), (10, 11)]
但是我期待的输出像
[(9, 10), (10, 11), (11, 12)]
heapq
的条件不是 "sort guarantee" 提供的列表。相反,它保证 q[k] <= q[2*k+1]
和 q[k] <= q[2*k+2]
(在您的示例中使用 q
)。
这是因为它在内部作为二叉树进行管理。
如果你只是希望使用排序列表,你可以使用heappop
作为shown here。在您的具体示例中,您可以:
sorted_q = [heappop(q) for i in range(len(q))
如您所料,结果将是:
>>> print sorted_q
[(9, 10), (10, 11), (11, 12)]
理论解释here in the docs。相关的是以下行:
The interesting property of a heap is that a[0] is always its smallest element.
这是条件q[k] <= q[2*k+1]
和q[k] <= q[2*k+2]
的直接结果,这是堆的条件
但是,对于数组其余部分的顺序没有进一步保证。而且,事实上,以下两棵树都是有效的堆:
0
1 2
2 5 3 4
和
0
2 1
5 3 4 2
其中分别存储为
[0, 1, 2, 2, 5, 3, 4]
和
[0, 2, 1, 5, 3, 4, 2]
我的印象是第一个值决定了堆中的值位置,但事实并非如此。
from __future__ import print_function
import heapq
q = []
heapq.heappush(q, (10, 11))
heapq.heappush(q, (11, 12))
heapq.heappush(q, (9, 10))
print(q)
这给了我
的输出[(9, 10), (11, 12), (10, 11)]
但是我期待的输出像
[(9, 10), (10, 11), (11, 12)]
heapq
的条件不是 "sort guarantee" 提供的列表。相反,它保证 q[k] <= q[2*k+1]
和 q[k] <= q[2*k+2]
(在您的示例中使用 q
)。
这是因为它在内部作为二叉树进行管理。
如果你只是希望使用排序列表,你可以使用heappop
作为shown here。在您的具体示例中,您可以:
sorted_q = [heappop(q) for i in range(len(q))
如您所料,结果将是:
>>> print sorted_q
[(9, 10), (10, 11), (11, 12)]
理论解释here in the docs。相关的是以下行:
The interesting property of a heap is that a[0] is always its smallest element.
这是条件q[k] <= q[2*k+1]
和q[k] <= q[2*k+2]
的直接结果,这是堆的条件
但是,对于数组其余部分的顺序没有进一步保证。而且,事实上,以下两棵树都是有效的堆:
0
1 2
2 5 3 4
和
0
2 1
5 3 4 2
其中分别存储为
[0, 1, 2, 2, 5, 3, 4]
和
[0, 2, 1, 5, 3, 4, 2]