相比較於普通佇列,優先佇列賦予每個元素(節點)乙個不同的優先順序priotity,優先順序值越小,優先順序越大
。每次出列操作pop都會彈出優先順序最高的元素
。類似的c語句結構可能定義如下:
typedef struct _item
item;
typedef struct _pnode
pnode, *pqueue;
其中:
結構體item表示具體元素,包括乙個資料域和乙個優先順序域;
結構體pnode表示對接節點,通過指標next相互鏈結
現在,我們的需求是用python實現優先佇列。
我們使用python自帶的heapq模組
(堆佇列演算法)。有關heapq的描述如下:
heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for all k, counting elements from 0. for the sake of comparison, non-existing elements are considered to be infinite. the interesting property of a heap is that a[0] is always its smallest element.意思是說:堆是一種陣列,對所有元素k(0 ~ n-1)都滿足a[k] <= a[2*k+1]和 a[k] <= a[2*k+2]
。這是一種小項堆
的描述。陣列的第乙個元素a[0]永遠是最小的。
import heapq
class priorityqueue:
def __init__(self):
self._queue=
self._index=0
def pop(self):
def push(self, item, priotity):
self._index += 1
class item:
def __init__(self, name):
self.name = name
# 返回乙個可以用來表示物件的可列印字串
def __repr__(self):
return 'item()'.format(self.name)
def priorityqueue_test():
que = priorityqueue()
que.push(item('aaa'), 1)
que.push(item('bbb'), 2)
que.push(item('ccc'), 5)
que.push(item('ddd'), 4)
print(que._queue)
first = que.pop()
print(first)
second = que.pop()
print(second)
print(que._queue)
if __name__ == "__main__":
priorityqueue_test()
類priorityqueue定義了變數_queue(列表)和_index,_queue用於儲存佇列元素;
,加[-1]表示獲取元組的最後一項
;,然後將索引加1;
push中將原始優先順序取負號,用於將值最大的元素方法堆的最前面
。(之前說過,值越大,優先順序越小);
元素的比較是對元組的各個成員的比較,加入索引也是為了比較。
類item過載了__repr__方法
,用於返回乙個可以用於列印的字串
,也就是'item(***)'。其中類似於c語言中的%s,將使用.format()替換;
寫乙個測試方法,priorityqueue_test,push了四個元素。爾後又pop了兩次。為了檢視列表內部布局,筆者還直接列印了類的私有變數。測試輸出如下:
[(-5, 2, item('ccc')), (-4, 3, item('ddd')), (-2, 1, item('bbb')), (-1, 0, item('aaa'))]
item('ccc')
item('ddd')
[(-2, 1, item('bbb')), (-1, 0, item('aaa'))]
有此可以看出,低優先順序最先出列,高優先順序的元素aaa放在list的最後乙個(相對於heapq來說,它是最大的)最後彈出。
學會使用heapq---堆演算法;
學會使用_repr__方法;
學會元組的比較。
《python cookbook》1.6 「實現優先佇列」
python優先佇列
q queue.priorityqueue q.put 呼叫的是heapq.heap item 而headpush 方法則是呼叫每個item的比較大小方法,預設是小的在頂端,所以是小頂堆。所以能用元組自定義插入順序,比如 2,item1 3,item2 所以q.put 2.item1 q.put 3...
python優先佇列
最近刷題的時候遇到了優先佇列。與一般的佇列 先進先出fifo 不同的是,優先佇列一般是最高端的優先出 即最大的先出 一開始想到的,可以用堆來維護乙個優先佇列。不過,python中的堆是乙個小根堆,即每次頂部pop出的都是最小值。這樣一來,我想到了41.資料流中的中位數,能不能把數字變負,寫入小根堆。...
大一寒假集訓(9) 優先佇列
定義乙個priority queue的方法為 priority queue name type通常為結構體 其中,type可以是任何基本型別或者容器,name為優先隊 列的名字。和queue不一樣的是,priority queue沒有front 和back 而只能通過top 或pop 訪問隊首元素 ...