对于实现一个优先级队列程序的注解

来源:互联网 发布: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
原创粉丝点击