優先佇列(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...