如何确定Python的heapq库管理的项目顺序?

时间:2016-04-07 14:24:16

标签: python python-2.7 heap

我的印象是第一个值确定了堆中的值位置,但似乎并非如此。

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)]

1 个答案:

答案 0 :(得分:3)

heapq上的条件不是提供列表的“排序保证”。相反,它保证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。相关的是以下几行:

  

堆的有趣属性是a [0]始终是它的最小元素。

这是条件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]