Python 如何实现按给定优先级对项目排序的队列?
我不理解传递给Python 如何实现按给定优先级对项目排序的队列?,python,heap,Python,Heap,我不理解传递给heappush的参数。为什么是负优先级 import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def push (self, item, priority): heapq.heappush (self._queue,(-priority, self._index, item))
heappush
的参数。为什么是负优先级
import heapq
class PriorityQueue:
def __init__(self):
self._queue = []
self._index = 0
def push (self, item, priority):
heapq.heappush (self._queue,(-priority, self._index, item))
self._index += 1
这取决于
优先级的含义
有以下几点:
- pull_highest_priority_元素:从具有最高优先级的队列中删除元素,然后返回它
它在pull
操作的原始实现中包含了这段代码:
如果最高.priority
因此,这篇Wikipedia文章假设应该首先从队列中提取优先级为的节点
这似乎也是您在问题中包含的代码的作者所做的假设。之所以需要否定,是因为Python的heapq
模块实现了一个最小堆,它将以最小值而不是最大值拉动节点。这就是代码在将节点推送到堆时否定优先级的原因
上面引用的维基百科文章承认还有一个惯例:
一些约定颠倒了优先级顺序,认为较低的值是较高的优先级,因此这也被称为“get_最小元素”,在文献中通常被称为“get min”
如果这是您的优先级
类的约定,那么您不会否定优先级
最后一点注意:Python也有,它使用了后一种约定:先提取较小的值。因此,该实现不会与您的代码执行相同的操作。它将反转优先级,因此以前具有较高优先级的元素现在将具有较低的优先级。