優(yōu)先隊(duì)列是堆的常見(jiàn)應(yīng)用,優(yōu)先隊(duì)列也有兩種形式:最大優(yōu)先隊(duì)列和最小優(yōu)先隊(duì)列
優(yōu)先隊(duì)列是一種用來(lái)維護(hù)由一組元素構(gòu)成的集合S的數(shù)據(jù)結(jié)構(gòu),其中的每一個(gè)元素都有一個(gè)相關(guān)的值,稱為關(guān)鍵字,其中最大優(yōu)先隊(duì)列的典型應(yīng)用就是共享計(jì)算機(jī)系統(tǒng)的作業(yè)調(diào)度。
一個(gè)最大優(yōu)先隊(duì)列支持以下四個(gè)操作:
- INSERT(S, x),把元素x插入集合S中
- MAXIMUM(S),返回S中具有最大鍵字的元素
- EXTRACT-MAX(S),去掉并返回S中的具有最大鍵字的元素
- INCREASE-KEY(S, x, k),將元素x的關(guān)鍵字值增加到k
MAXIMUM(S)
可通過(guò)HEAP-MAXIMUM在O(1)時(shí)間內(nèi)實(shí)現(xiàn)MAXIMUM操作
HEAP-MAXIMUM(A)
return A[1]
EXTRACT-MAX(S)
可通過(guò)HEAP-EXTARCT-MAX實(shí)現(xiàn),類似于堆排序中HEADPSORT過(guò)程中的for循環(huán)體
HEAP-EXTRACT-MAX(A)
if A.heap-size < 1
error "heap underflow"
max = A[1]
A[1] = A[A.heap-size]
A.heap-size = A.heap-size - 1
MAX-HEAPIFY(A, 1)
return max
INCREASE-KEY(S, x, k)
HEAP-INCREASE-KEY(A, i, key)
if key < A[I]
error "new key is smaller than current key"
A[I] = key
while i > 1 and A[PARENT(i)] < A[i]
exchange A[i] with A[PARENT(i)]
i = PARENT(i)
INSERT(S, x)
MAX-HEAP-INSERT(A, key)
A.heap-size = A.heap-size + 1
A[A.heap-size] = math.MinInt32
HEAP-INCREASE-KEY(A, A.heap-size, key)