如何基於最大堆實現最大優先佇列

2021-08-18 20:28:31 字數 1689 閱讀 9445

優先佇列(priority queue)是一種用來維護由一組元素構成的集合a的資料結構, 其中的每個元素(

x x

)都有乙個相關的值, 稱為關鍵字(ke

y' role="presentation">key

key).

乙個最大優先佇列支援以下操作:

在包含n個元素的堆中, 所有優先佇列的操作都可以在

o' role="presentation">o

o(lg

n n

)事件內完成.

maxheapinsert的輸入是要被插入到最大堆a中的元素的關鍵字. 可以先通過增加乙個key值為負無窮的葉子結點來擴充套件最大堆, 同時呼叫heapincreasekey來為新結點設定相對應的關鍵字, 同時保持最大堆的性質.

偽**實現為:

max-heap-insert(a, key)

a[heap-size] = a[heap-size] + 1

a[a.heap-size] = -∞

heap-increase-key(a, a.heap-size, key)

heapmaximum即返回堆中的最大值a[1]

偽**實現為:

heap-maximum(a)

return

a[1]

heapextractmax即返回並除去堆中的最大值a[1], 再呼叫maxheapify來維護最大堆

偽**實現為:

heap-extract-max(a)

ifa.heap-size < 1

error "heap underflow"

max = a[1]

a[1] = a[heap-size]

a.heap-size = a.heap-size - 1

max-heapify(a, 1)

return max

heapincreasekey可以採用自底向上的方法, 當前元素關鍵字與其父結點關鍵字進行比較, 如果當前結點關鍵字比較大, 則與父結點進行交換; 不斷迴圈該過程, 直至當前結點沒有父結點., 或者當前結點關鍵字小於其父結點.

過程**為:

偽**實現為:

heap-increase-key(a, i, key)

if key < a[i]

error "new key is smaller than current key"

a[i] = key

while i > 1

anda[parent(i)] < a[i]

exchange a[i] with a[parent(i)]

i = parent(i)

基於最大堆實現優先佇列

queue的介面結構 public inte ce queue基於最大堆的優先佇列的實現,輕鬆完成入隊和出隊等基本操作 如果對最大堆的實現不理解請檢視前一篇部落格 public class priorityqueue implements queue override public int gets...

優先佇列及最小堆最大堆

n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉結點,k 2i 則是左孩子,k 2i 1 是右孩子 若將此序列所儲存的向量r 1.n 看做是一棵...

堆(優先佇列,即最大堆,最小堆)

優先佇列 priority queue 特殊的 佇列 取出元素的順序是 依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序。堆的兩個特性 結構性 用陣列表示的完全二叉樹 有序性 任一結點的關鍵字是其子樹所有結點的最大值 或最小值 最大堆 maxheap 也稱 大頂堆 最大值 最小堆 min...