Python和内置堆

时间:2009-09-14 17:45:13

标签: python

目前,我正在尝试使用内置的heapq库在Python中编写优先级队列。但是,我不知道如何处理Python对打破平局所做的事情,我希望有一个特定的条件,我可以决定打破平局发生了什么,而不是看起来几乎捡到一些东西的heapq库随机排队。有没有人知道重写打破平局条件的方法,还是从头开始构建优先级队列会更容易?

1 个答案:

答案 0 :(得分:10)

heapq使用队列项(__le__和朋友)的内在比较。解决这个限制的一般方法是称为“装饰/未装饰”的旧方法 - 这是我们在排序key=参数之前所做的事情。

简单地说,你排队和出列,不仅仅是你关心的项目(“有效载荷”),而是“装饰”成元组的项目,这些项目以你需要的“密钥”heapq开头考虑。因此,例如,如果您希望通过(foo.x, time.time(), foo)属性进行优先级排序,并且在队列中插入时间打破了关系,那么排队像x这样的元组是正常的 - 当然,当您对您进行排队时“ uncorate“,通过排队获取元组的[-1]项。

所以,只需把“二级钥匙”放在你排队的“装饰”元组中,即使是“打破”这个元组,你想要打破这种“关系”。