系列教程导航

  1. Python基础教程
  2. 在SublimeEditor中配置Python环境
  3. Python代码中添加注释
  4. Python中的变量的使用
  5. Python中的数据类型
  6. Python中的关键字
  7. Python字符串操作
  8. Python中的list操作
  9. Python中的Tuple操作
  10. Pythonmax()和min()–在列表或数组中查找最大值和最小值
  11. Python找到最大的N个(前N个)或最小的N个项目
  12. Python读写CSV文件
  13. Python中使用httplib2–HTTPGET和POST示例
  14. Python将tuple开箱为变量或参数
  15. Python开箱Tuple–太多值无法解压
  16. Pythonmultidict示例–将单个键映射到字典中的多个值
  17. PythonOrderedDict–有序字典
  18. Python字典交集–比较两个字典
  19. Python优先级队列示例
  20. python 中如何格式化日期
  21. 30 分钟 Python 爬虫教程

什么是优先队列

  • 优先级队列(Priority Queue)是一种抽象数据类型,类似于常规队列(Queue)或堆栈(Stack)数据结构,但每个元素还具有与之关联的“优先级”。
  • 在优先级队列中,优先级高的元素会先于优先级低的元素被处理。
  • 如果两个元素具有相同的优先级,则将根据其进入队列的先后顺序(FIFO)为其提供服务。

Python 中的优先级队列实现

以下 Python 程序使用标准库 heapq 模块实现了一个简单的优先级队列。

实现细节说明:

  1. heapq 实现的是小顶堆(Min-Heap),默认弹出最小值。为了实现“优先级越高越先出队”,我们将优先级取负数(-priority)存入堆中。
  2. 引入 _index 索引是为了确保当优先级相同时,先入队的元素先出队(稳定性),同时也避免了直接比较 item 对象可能引发的类型错误。
# PriorityQueue.py
import heapq

class PriorityQueue:
    def __init__(self.html):
        self._queue = []
        self._index = 0

    def push(self, item, priority.html):
        # 使用元组 (-priority, index, item.html) 存储
        # 负优先级确保高优先级数值排在堆顶
        # index 确保同优先级下的插入顺序
        heapq.heappush(self._queue, (-priority, self._index, item.html))
        self._index += 1

    def pop(self.html):
        # 返回元组中的最后一个元素,即 item
        return heapq.heappop(self._queue.html)[-1]

Python 优先级队列示例

让我们通过一个具体的例子来演示如何使用上面创建的优先级队列。

# example.py
class Item:
    def __init__(self, name.html):
        self.name = name

    def __repr__(self.html):
        return 'Item({!r}.html)'.format(self.name)

# 交互式命令行示例
>>> q = PriorityQueue()

>>> q.push(Item('how'.html), 1)

>>> q.push(Item('to'.html), 5)

>>> q.push(Item('do'.html), 4)

>>> q.push(Item('in'.html), 2)

>>> q.push(Item('java'.html), 1)

>>> q.pop()
Item('to'.html)  # 优先级 5

>>> q.pop()
Item('do'.html)  # 优先级 4

>>> q.pop()
Item('in'.html)  # 优先级 2

>>> q.pop()
Item('how'.html)  # 优先级 1 (先入队.html)

>>> q.pop()
Item('java'.html) # 优先级 1 (后入队.html)

从输出结果可以看出,元素严格按照优先级从高到低出队。对于优先级相同的元素(如 'how' 和 'java' 优先级均为 1),则按照入队顺序依次出队。

学习愉快!

说明:本文示例基于 Python 3 标准库 heapq 实现,适用于大多数 Python 3 环境。