我需要一个优先级队列,它首先获取具有最高优先级值的项目。我目前正在使用队列库中的 PriorityQueue 类。但是,此函数仅首先返回具有最低值的项目。我尝试了一些丑陋的解决方案,例如 (sys.maxint - priority) 作为优先级,但只是想知道是否存在更优雅的解决方案。
问问题
14884 次
2 回答
34
改为使用负优先级,无需从 中减去sys.maxint
。
queue.put((-priority, item))
例如,优先级为 -10 的项目将在优先级为 -5 的项目之前返回。
于 2013-02-27T22:53:29.360 回答
4
您可以扩展优先级队列以保持逻辑不变:
from Queue import PriorityQueue
class DualPriorityQueue(PriorityQueue):
def __init__(self, maxPQ=False):
PriorityQueue.__init__(self)
self.reverse = -1 if maxPQ else 1
def put(self, priority, data):
PriorityQueue.put(self, (self.reverse * priority, data))
def get(self, *args, **kwargs):
priority, data = PriorityQueue.get(self, *args, **kwargs)
return self.reverse * priority, data
minQ = DualPriorityQueue()
maxQ = DualPriorityQueue(maxPQ=True)
minQ.put(10, 'A')
minQ.put(100, 'A')
maxQ.put(10, 'A')
maxQ.put(100,'A')
print "Min DQ: {}".format(minQ.get())
print "Max DQ: {}".format(maxQ.get())
输出:
Min DQ: (10, 'A')
Max DQ: (100, 'A')
于 2019-07-09T20:47:15.603 回答