優先佇列概念與其線性表的實現

2021-08-31 07:28:25 字數 1206 閱讀 4709

優先佇列的特點是存入其中的每項資料都另外附有乙個數值,表示這個項的優先程度,稱其為優先順序。

優先佇列應該保證,在任何時候訪問和彈出的,總是當時在這個結構裡儲存的所有元素中,優先順序最高的。

(在下面的實現中,假定需要儲存的資料元素用「<=」比較優先順序,值較小的元素優先順序更高

將優先佇列定義為乙個類:

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