優先佇列的特點是存入其中的每項資料都另外附有乙個數值,表示這個項的優先程度,稱其為優先順序。
優先佇列應該保證,在任何時候訪問和彈出的,總是當時在這個結構裡儲存的所有元素中,優先順序最高的。
(在下面的實現中,假定需要儲存的資料元素用「<=」比較優先順序,值較小的元素優先順序更高)
將優先佇列定義為乙個類:
class prioque():
def __init__(self, elist=):
self._elems = list(elist)
self._elems.sort(reverse=true)
這裡用list 進行轉換,有兩個作用:
1.對實參表做乙個拷貝,避免共享。
2. 這樣也使建構函式的實參可以是任何可迭代物件,例如迭代器或者元祖等。
(reverse 引數要求做大到小的排序: list 彈出最後乙個,值最小,優先順序最高)
插入元素是最複雜的操作,需要找到正確的插入位置
def enqueue(self, e):
i = len(self._elems) - 1
while i > 0:
if self._elems[i] <= e:
i -= 1
else:
break
self._elems.insert(i+1, e)
while 迴圈從最後的元素開始檢查,結束時i 或為-1, 或為第乙個大於e元素的下標。
def is_empyt(self):
return not self._elems
def peek(self):
if self.is_empty():
raise prioqueueerror("in top")
retrun self._elems[-1]
def dequeue(self):
if self.is_empty():
raise prioqueueerror("in pop")
retrun self._elems.pop()
對連續表實現的分析:
插入元素是o(n)操作,其他都是o(1)。
實際上無論採用怎樣的具體實現技術,在插入元素和取出元素的操作中總有一種是具有線性複雜度的操作
線性表 佇列的陣列實現
定義和應用 佇列 queue 是乙個線性表,其插入和刪除分別在表的不同端進行。它是一種先進先出 fifo 的線性表,插入元素的一端稱為隊尾 bakc或者rear 刪除元素的一段叫作隊首 front 以陣列來實現,需要考慮空間的利用率。如果採用類似陣列和棧一般的對映公式location i i,那麼每...
線性表概念
線性表的抽象資料型別包括 資料物件集合 和基本操作集合 資料物件集合定義了線性表的資料元素及元素之間的關係,基本操作集合定義了在資料物件上的一些基本操作。1.資料物件集合 線性表的資料物件集合為,每個元素的型別均為datatype,其中除了第乙個元素a1,每乙個元素都有唯一的前驅元素。除了最後乙個元...
線性表 佇列
和棧相反,佇列是一種先進先出 first in first out 縮寫為fifo 的線性表。它只允許在表的一端進行插入,而在另一端刪除元素。雙端佇列 限定插入和刪除操作在表的兩端進行的線性表 單鏈佇列 佇列的鏈式儲存表示 和線性表類似,佇列也可以有兩種儲存表示。用鍊錶表示的佇列簡稱鏈佇列。type...