python轉行系列9 優先佇列與 repr

2021-09-13 21:54:08 字數 2357 閱讀 2450

相比較於普通佇列,優先佇列賦予每個元素(節點)乙個不同的優先順序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 訪問隊首元素 ...