日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

用Python实现优先级队列

發布時間:2024/4/11 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Python实现优先级队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提出問題:

假設我們想要實現一個隊列,它能夠以指定的優先級對元素排序,并且每次pop()彈出都時優先級最高的那個元素。

解決思路:

首先,我們必須清楚隊列的概念,就是所謂的“先進先出”,然后可以使用heapq模塊構建一個簡單的優先級隊列。

具體操作看下面代碼:

import heapq class PQueue:def __init__(self):self._queue=[]self._index=0def push(self,item,prior):heapq.heappush(self._queue,(-prior,self._index,item))self._index+=1def pop(self):return heapq.heappop(self._queue)[-1]

上面是定義一個PQueue類隊列,下面是對這個類的使用。

class Item:def __init__(self,name):self.name=namedef __repr__(self):return 'Item({!r})'.format(self.name)


我們仔細分析上面的代碼,可以看出第一次pop()彈出時,返回的元素是優先級最高的,然后彈出的是優先級次高的。當某兩個元素(Foo和gold)優先級相同時,返回的順序和他們插入隊列的順序一樣。

深入討論:

上面的代碼實現了所謂的優先級隊列,核心就在于對heapq模塊的使用。函數heapq.heappush()是往列表_queue插入元素,而heapq.heappop()是從列表中彈出元素,并且保證了列表中的第一個元素優先級最低。heappop()方法總是返回最小的元素,因為它以堆的形式存儲的,這一點之前的文章中我們提到過了,這其實是隊列能彈出正確元素的關鍵。

除此之外,由于push()和pop()操作的復雜度都是O(logN),其中N代表對元素的數量,因此就算是N的數值很大,這些操作的效率也會很高。

其中,隊列以元組(-prior,index,item)的形式組成,prior代表權重,取值為負,是保證隊列中的元素按照優先級從高到低排列。這點和正常堆的順序相反,一般情況下堆的順序是從小到大的順序排列的。

變量index的作用是為了讓具有相同優先級的元素以適當的順序排列。通過維護一個不斷遞增的索引,元素以他們進入隊列的順序來排列。但是,index對具有相同優先級的元素做比較操作時扮演了重要的角色。

總結

以上是生活随笔為你收集整理的用Python实现优先级队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。