对于实现一个优先级队列程序的注解
来源:互联网 发布:edge浏览器打不开淘宝 编辑:程序博客网 时间:2024/06/04 23:34
在学习《PythonCookbook》一书中,遇到了实现一个优先级队列的问题,刚开始在看源代码时百思不得其解,后来经过反复阅读和查资料终于明白原理。
以下问题,代码均来自《PythonCookbook》一书
问题:怎样实现一个按优先级排序的队列?并且在这个队列上面每次 pop 操作总是返回
优先级最高的那个元素
解决方案:
利用heapq编写实现优先级队列的类
import heapqclass 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 def pop(self): return heapq.heappop(self._queue)[-1]
下面是使用方式:
>>>class Item:... def __init__(self, name):... self.name = name... def __repr__(self):... return 'Item({!r})'.format(self.name)>>> q = PriorityQueue()>>> q.push(Item('foo'), 1)>>> q.push(Item('bar'), 5)>>> q.push(Item('spam'), 4)>>> q.push(Item('grok'), 1)>>> q.pop()Item('bar')>>> q.pop()Item('spam')>>> q.pop()Item('foo')>>> q.pop()Item('grok')
以下是我自己对于本问题源代码的理解:
heapq.heappush(self._queue, (-priority, self._index, item))
将(-priority, self._index, item)元组添加至self._queue队列列表中,其中对priority取负值,这样,在列表从小到大heapq.heappop弹出元素时会将最大的priority先弹出
self._index 为了保证当priority一样时,仍然可以通过插入的顺序来进行优先级比较。
heapq.heappop(self._queue)[-1] 弹出优先级最高(-priority值最小)的元素的最右边的一项。
heapq模块:
heapq.heapify(heap) 强制heapq方法
heapq.nlargest(n,heap)
heapq.nsamllest(n,heap)得到队列中最大(小)的n个元素 可以接受key来进行比较
0 0
- 对于实现一个优先级队列程序的注解
- 一个简单的优先级队列实现
- 优先级队列的实现
- 优先级队列的实现
- 一个作业调度程序,采用的链式优先级队列
- 关于优先级队列的实现
- 优先级队列的一种实现
- 堆实现的优先级队列
- Python利用heapq实现一个优先级队列
- 一般队列和循环队列及优先级队列的实现
- 生产消费者4 - 实现一个基于优先级的传输队列【消费顺序是由优先级决定的而不是抵达时间】
- java中关于优先级队列的实现
- C语言实现的优先级队列
- 泛型优先级队列的实现
- 基于大顶堆实现的最大优先级队列
- 堆实现的最小优先级队列
- 关于优先级队列的实现 (r)
- 【C++】优先级队列的模拟实现
- TCP/IP详解 笔记1
- 155. Min Stack
- 第一章
- Java中的sleep()和wait()的区别
- 和BEM的战斗:10个常见问题及如何避免
- 对于实现一个优先级队列程序的注解
- 块元素、行内元素,替换元素、非替换元素
- Obeject内的方法
- 虚析构函数
- Eratosthenes筛选法
- C#控制台 string字符串第一个字母的索引值是0,输出第一个字符
- 项目优化涉及到的相关文章
- HDOJ-1852 More is better
- 文章标题