想要實現乙個佇列,能夠以給定的優先順序來對準榮盛排序,而且每次pop操作時候都會返回優先順序最高的那個元素
使用heapq模組來實現乙個簡單的優先順序佇列
import heapq
class priorityqueue:
def __init__(self):
self._queue =
self._index = 0
def push(self, item, priority):
self._index += 1
def pop(self):
簡單的使用
class item:
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._queue)
print(q.pop())
print(q.pop())
print(q.pop())
輸出
[(-5, 1, item(『bar』)), (-1, 0, item(『foo』)), (-4, 2, item(『spam』)), (-1, 3, item(『grok』))]
item(『bar』)
item(『spam』)
item(『foo』)
class item:
def __init__(self, name):
self.name= name
def __repr__(self):
return 'item()'.format(self.name)
a = item('foo')
b = item('bar')
print(a)
print(b)
a輸出item(『foo』)
item(『bar』)
traceback (most recent call last):
file 「/users/zhangkun/documents/github/geektime/pycookbook.py」, line 26, in
a如果按照元組(priority,item)形式來表示元素,只要優先順序不同,就能比較,如果優先順序相同就比較第二項,此時也會和上面一樣報錯
class item:
def __init__(self, name):
self.name= name
def __repr__(self):
return 'item()'.format(self.name)
a = (1, item('foo'))
b = (2, item('bar'))
print(a輸出:
true
traceback (most recent call last):
file 「/users/zhangkun/documents/github/geektime/pycookbook.py」, line 28, in
print(c不光有優先順序,還通過引入額外的索引值建立元組(priority,index,item)就完全避免這個問題,因為沒有兩個元組index相同,一單比較操作的結果可以確定了,python就不會找再去比較剩下的元組其他元素了劃重點!!!
class item:
def __init__(self, name):
self.name= name
def __repr__(self):
return 'item()'.format(self.name)
c = (2, 1,item('ccc'))
d = (2, 2,item('ccc'))
print(c輸出 true
1 5 實現乙個優先順序佇列
問題 怎樣實現乙個按優先順序排序的佇列?並且在這個佇列上面每次pop操作總是返回優先順序最 高的那個元素 通過引入另外的 index 變數組成三元組 priority,index,item 就能很好的避免上面 的錯誤,因為不可能有兩個元素有相同的 index 值。import heapq class...
1 5實現乙個優先順序佇列
問題 怎樣實現又給按優先順序排序的佇列?並且在佇列上面每次pop操作總是返回優先順序最高的那個元素 解決方案 下面的類利用heapq模組實現了乙個簡單的優先順序佇列 import heapq class priorityqueue def init self self.queue self.inde...
優先順序佇列的實現
優先順序佇列 佇列裡面的所有元素都有相應的權值,元素的刪除順序由這些權值決定。優先順序佇列的實現一般用堆來實現其效率比一般的實現要高。要弄清楚堆我們得先弄清楚下面的定義 一顆大根樹 小根樹 是這樣一棵樹,其中每個節點的值都大於 小於 或等於其子節點 如果有子節點的話 的值。大根堆 乙個大根堆 小根堆...