堆乙個很常見的應用:作為高效的優先順序佇列。如堆一樣,佇列也有兩種:最大優先順序佇列和最小優先順序佇列。優先順序佇列是一種用來維護由一組元素構成的集合s的資料結構,這一組元素中的每乙個都有乙個關鍵字key。乙個最大優先順序佇列支援以下操作:
最大優先順序佇列的乙個應用是在一台分時計算機上進行作業排程。這種佇列對要執行的各作業及他們之間的相對優先關係加以記錄。當乙個作業做完或被中斷時,用extract-max操作從所有等待的作業中,選擇出具有最高優先順序的作業。在任何時候,乙個新作業都可以用insert加入到佇列中去。
程式heap-maximum實現maximum操作
heap-maximum(a)
return a[1]
heap-extract-max(a)
if heap-size[a] < 1
then error "heap underflow"
max <- a[1]
a[1] <- a[heap-size[a]]
heap-size[a] <- heap-size[a] - 1
max-heapify(a, 1)
return max
關鍵字需要增加的元素由對應陣列的小標i來標識。在從本結點往根結點移動的路徑上,為新增大的關鍵字尋找合適的位置。在移動的過程中,此元素不斷地與其父母相比,如果此元素的關鍵字較大,則交貨它們的關鍵字且繼續移動。當元素的關鍵字小於其父母時,此時最大堆性質成立,因此程式終止。
heap-increase-key(a, i, key)
if key < a[i]
then error "new key is smaller than current key"
a[i] <- key
while i > 1 and a[parent(i)] < a[i]
do exchange a[i] <->a[parent(i)]
i <- parent(i)
下面的max-heap-insert實現了insert操作。它的輸入是要插入到最大堆a中的新元素的關鍵字。這個程式首先加入乙個關鍵字值為負無窮大的葉節點來擴充套件最大堆,然後呼叫heap-increase-key來設定新結點的關鍵字的正確值,並保持最大堆性質。
max-heap-insert(a, key)
heap-size[a] <- heap-size[a] + 1
a[heap-size[a]] <- -max(int)
heap-increase-key(a, heap-size[a], key)
在包含n個元素的堆上,max-heap-insert的執行時間為o(lgn)。
課後題:在堆排序的bulid-max-heap過程也可以通過反覆呼叫max-heap-insert,將各元素插入堆中實現。
build-max-heap『(a)
heap-size[a] <- 1
for i <- 2 to length[a]
do max-heap-insert(a, a[i])
佇列 優先順序佇列
優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去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...