Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实现按给定优先级对项目排序的队列?_Python_Heap - Fatal编程技术网

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也有,它使用了后一种约定:先提取较小的值。因此,该实现不会与您的代码执行相同的操作。

它将反转优先级,因此以前具有较高优先级的元素现在将具有较低的优先级。