Python 實現優先順序佇列

2021-10-01 08:32:46 字數 2785 閱讀 6409

如何實現乙個按優先順序排序的佇列,並且每次執行 pop 返回的是優先順序最高的元素?

這裡引用 python 提供的heapq模組。

import heapq

class

priorityqueue

(object):

'''實現優先順序佇列

每次執行 pop 操作返回優先順序最高的元素

'''def__init__

(self)

:# 建立初始佇列,以及索引(確保優先順序重複的情況,能夠用先後順序區分)

self._queue =

self._index =

0def

push

(self, item, priority)

:# 這裡插入的第二個引數包括 優先順序,索引,

(-priority, self._index, item)

) self._index +=

1def

pop(self):[

-1]

方法的使用:

class

item

(object):

def__init__

(self, name)

: self.name = name

def__repr__

(self)

:return

'item()'

.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)print

(q.pop())

# item('bar')

print

(q.pop())

# item('spam')

print

(q.pop())

# item('foo')

print

(q.pop())

# item('grok')

這裡可以觀察到,第乙個pop()返回的是優先順序最高的元素。另外,相同優先順序的元素*例子中的foogrok),pop操作執行返回的結果是按照插入佇列的順序。

上面的**中,佇列包含(-priority, index, item)的元組。優先順序為負數的目的是使得元素按照優先順序從高到低排序。

index的作用是保證同等優先順序元素的先後排序。這裡儲存遞增的index變數是為了確保按照他們插入的順序排序。舉例說明index變數的作用。

假設item例項不支援排序:

>>

> a = item(

'foo'

)>>

> b = item(

'bar'

)>>

> a < b

traceback (most recent call last)

:file ""

, line 1,in

typeerror: unorderable types: item(

)< item(

)

如果使用元組(priority, item),只要兩個元素的優先順序不同就能比較。但是如果兩個元素優先順序一樣,同樣會出錯:

>>

> a =(1

, item(

'foo'))

>>

> b =(5

, item(

'bar'))

>>

> a < b

true

>>

> c =(1

, item(

'grok'))

>>

> a < c

traceback (most recent call last)

:file ""

, line 1,in

typeerror: unorderable types: item(

)< item(

)

這裡引入index變數就能夠解決這個問題,因為index是遞增的,不可能相同。而 python 元組比較的操作是前面的比較確定結果就不會對後面的進行比較,所以這裡組成的元組為(priority, index, item)

>>

> a =(1

,0, item(

'foo'))

>>

> b =(5

,1, item(

'bar'))

>>

> c =(1

,2, item(

'grok'))

>>

> a < b

true

>>

> a < c

true

如果需要在多執行緒中使用同乙個佇列,需要適當新增鎖和訊號量的機制。

heapq更詳細的內容,可檢視官方文件。

python優先順序佇列 python 優先順序佇列

簡介 優先順序佇列是基於堆的,關於堆的時候可以參考文章堆,優先順序佇列就是入隊時,會分配乙個優先順序,之後出隊時,根據優先順序出列。如,入隊時 4,a 6,r 3 d 則出隊順序 6,r 4,a 3 d 優先順序佇列的python實現 class priorityqueue object def i...

python優先順序佇列

class priorityqueue data dict def init self pass 入隊 如果物件沒有優先等級,則新增到隊尾,如果對空,則預設等級為1 如果物件有優先等級,如果有同等級的則新增到對應等級末尾 def push self,obj,key none if key none ...

優先順序佇列 python

在之前寫最短路徑,和哈夫曼編碼的時候都用到了優先順序佇列優化,用的是c 中的包,priority queue。那在python中會以什麼形式存在呢。class array object def init self,maxsize none self.elem none maxsize self.le...