優先順序佇列Priority queue

2022-05-26 06:06:05 字數 1634 閱讀 1583

擁有權值觀點的queue,,乙個是返回最高優先順序物件,乙個是在底端新增新的物件。這種資料結構就是優先順序佇列(priority queue) 。

實現利用max_heap完成,以vector表現的完全二叉堆。max_heap可以滿足priority_heap所需要的依照權值高低自動遞減的特性。

二叉堆是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。 有了這一性質,那麼二叉堆上最大值就是根節點了。

二叉堆的表現形式:我們可以使用陣列的索引來表示元素在二叉堆中的位置。

從二叉堆中,我們可以得出:

· 元素k的父節點所在的位置為[k/2]

· 元素k的子節點所在的位置為2k和2k+1

跟據以上規則,我們可以使用二維陣列的索引來表示二叉堆。通過二叉堆,我們可以實現插入和刪除最大值都達到o(nlogn)的時間複雜度。

對於堆來說,最大元素已經位於根節點,那麼刪除操作就是移除並返回根節點元素,這時候二叉堆就需要重新排列;當插入新的元素的時候,也需要重新排列二叉堆以滿足二叉堆的定義。現在就來看這兩種操作。

從下至上的重新建堆操作: 如果乙個節點的值大於其父節點的值,那麼該節點就需要上移,一直到滿足該節點大於其兩個子節點,而小於其根節點為止,從而達到使整個堆實現二叉堆的要求。

由上圖可以看到,我們只需要將該元素k和其父元素k/2進行比較,如果比父元素大,則交換,然後迭代,一直到比父元素小為止。

private static void swim(int k)

}

這樣,往堆中插入新元素的操作變成了,將該元素從下往上重新建堆操作:

**實現如下:

public static void insert(t s)

動畫如下:

由上至下的重新建堆操作:當某一節點比其子節點要小的時候,就違反了二叉堆的定義,需要和其子節點進行交換以重新建堆,直到該節點都大於其子節點為止:

**實現如下:

private static void sink(int k)

}

這樣,移除並返回最大元素操作delmax可以變為:

1. 移除二叉堆根節點元素,並返回

2. 將陣列中最後乙個元素放到根節點位置

3. 然後對新的根節點元素進行sink操作,直到滿足二叉堆要求。

移除最大值並返回的操作如下圖所示:

以上操作的實現如下:

public static t delmax()

動畫如下:

佇列 優先順序佇列

優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去1.public class priorityq 插入 public void insert long item else quearray j 1 item nitem 刪除 public long ...

優先順序佇列

分為最小優先順序佇列和最大優先順序佇列。優先順序佇列是一種用來維護一組元素構成的集合s的資料結構,這一組元素都有乙個關鍵字key,乙個最大優先順序佇列支援的操作 insert s,x 把x插入到集合s中 maxmum s 返回s中最大元素 extra max s 去掉s中最大關鍵字並返回該最大關鍵子...

優先順序佇列

1 include stdafx.h 2 include3 4 using namespace std 5 6 define max heap len 107 int heap max heap len 8 int heap size 0 the number of elements in heap...