數據結構與算法分析之優先隊列(堆)



1.優先隊列,也叫二叉堆,簡稱堆。


2.同二叉查找樹一樣,堆也有兩個性質,即結構性和堆序性。


3.堆的結構性質
堆是一棵被完全填滿的二叉樹,有可能的例外在底層,底層上的元素從左到右填入。
這樣的樹稱爲完全二叉樹(complete binary tree)。

4.一棵高度爲h的完全二叉樹有2^h到2^(h+1) - 1個節點


5.由於完全二叉樹的規律性,它可以用一個數組來實現而不需要指針。
排除數組中位置0,在數組中任一位置i上的元素,其左兒子在位置2i上,
右兒子在左兒子後的單元(2i+1)上。它的父親節點在位置i/2上。
數組實現方法的唯一問題在於,要事先估計堆的大小。


6.堆的堆序性質
能使操作被快速執行的性質是堆序性。在一個堆中,對於每一個節點X,X的父親中的關鍵字小於X中的關鍵字,根節點除外。
所以最小值在根節點上,因此FindMin會以常數時間完成運算。這種結構像是從大到小向上堆起來的一個堆。

7.堆的基本操作操作
a.Insert插入操作
爲了在插入過程中保證堆的序,一般使用的策略是上濾。
插入過程是:在堆的下一個空閒位置創建一個空穴,若X放在該空穴中並且不破壞堆的序則插入完成;
否則將空穴的父親節點元素移入該空穴,這樣空穴就會朝着根的方向上濾。循環上面的過程,直到X
能被放入空穴爲止。

b.DeleteMin(刪除最小元)
最小的元在根節點處,爲了保持堆的結構性質和堆序性質,刪除時和插入的策略是類似的,即下濾。
刪除操作會導致堆的最後一個元素X移動到合適的位置,先將刪除的地方視作一個空穴,
並將空穴的兒子節點中較小的那個替換空穴,重複此過程直到X能放入到某個空穴爲止。

以下3種方法必須通過某種方法得知每個元素的位置,才能以對數最壞情形執行。
c.DecreaseKey(降低關鍵字的值)
DecreaseKey(P, delta, H)操作會降低在位置P處的關鍵字的值,降值得幅度爲delta。這種操作用於系統管理程序,
系統管理程序能夠使它們的程序以最高優先級來運行。

d.IncreaseKey(增加關鍵字的值)
IncreaseKey(P, delta, H)操作將增加在位置P處的關鍵字的值,增值幅度爲delta。可以用下濾來完成。

e.Delete(刪除)
Delete(P, H)操作將刪除堆中位置P上的節點。先執行DecreaseKey(P,無窮大,H),然後再執行DeleteMin(H)。
主要用於當一個進程被用戶終止時,它必須從優先隊列中刪除。

f.BuildHeap(構建堆)

8.按照最小元設計的堆(也稱作最小值堆)在求最大元方面卻無任何幫助。實際上一個堆所蘊含的序的信息很少,
我們只能確定最大元在樹葉節點上。

9.優先隊列的應用
a.選擇問題
即在一組數中查找第k個最小或者最大的元素。先使用BuildHeap構建一個堆,然後執行k次DeleteMin,
得以找到第k個最小元。構建堆的最壞情形用時是O(N),執行k次DeleteMin的總運行時間是O(N + klogN),
總的運行時間是ceita(N log N)。可以對此進一步細化得到堆排序的應用算法。


b.事件模擬
即對系統調度問題的模擬


10.堆的缺點
除了不能執行精確Find外,堆的另一個明顯缺點是將兩個堆進行合併是困難的。

11.d-堆
d-堆是對二叉堆的簡單推廣,只是所有的節點都有d個兒子(因此,二叉堆是2-堆)。

12.左式堆
a.任意節點X的零路徑長(null path length, NPL)Npl(X)定義爲從X到一個沒有兩個兒子節點的最短路徑的長。
所以,具有0個或1個兒子的節點的Npl爲0,Npl(NULL) = -1
任一節點的零路徑長比它的諸兒子節點的零路徑長的最小值多1.
b.左式堆性質:對於堆中的每一個節點X,左兒子的零路徑長要大於或等於與右兒子的零路徑長。
c.左式堆的性質使得樹向左增加深度,因此得名左式堆。這樣做是爲了方便合併操作。
因爲左式堆趨於加深左路徑,所以堆中右路徑最短。
d.左式堆相關的定理:在右路徑上有r個節點的左式樹必然至少有2^r - 1個節。從這個定理可以得到,N個節點
的左式樹有一條右路經最多含有log(N + 1)個節點
e.對左式堆操作的一般思路是將所有的工作放到右路徑上進行。

13.左式堆的操作
左式堆的基本操作是合併,插入只是合併的特殊情形。根據左式堆的操作要集中在右子堆上這一性質,
合併的基本過程是,先將具有較小根值的堆H1的右子堆和具有較大根值的堆H2合併,合併後有可能會在較小根值
的根H1處破壞Npl性質,恢復Npl性的方法很簡單即將H1的左右子樹互換,最後一步是更新新根H1的Npl= H1->Right->Npl + 1.
遞歸執行上面的過程得以完成合並操作。
其他的操作如Insert和DeleteMin操作都可以看作是合併操作的變種。

合併操作的時間界是O(log N),同理DeleteMin操作的時間界也是O(log N)

14.斜堆(skew heap)
a.斜堆和左式堆間的關係類似於伸展樹和AVL樹之間的關係。斜堆是具有堆序的二叉樹,但是不存在對樹的結構限制。
b.與左式堆相同,斜堆的基本操作也是合併操作。


15.二項隊列
二項隊列不是一棵堆序樹,而是堆序樹的集合,稱爲森林。堆序樹中每一顆都是有約束的形式,叫做二項樹。
高度爲0的二項樹是一棵單節點樹;高度爲k的二項樹Bk通過將一顆二項樹B(k-1)附接到另一顆二項樹B(k-1)的根上構成。
綜上,二項樹Bk由一個帶有兒子B0,B1,...,B(k-1)的根組成。高度爲k的二項樹恰好有2^k個節點,而在深度d處的節點數是二項係數(k  d)

a.合併兩棵二項樹要花費常數時間,二項隊列中總共存在O(log N)棵二項樹,因此合併在最壞的情形下花費時間O(logN)。
b.二項隊列的插入操作最壞時間界爲常數O(N),即初始隊列爲空時。
c.二項隊列的實現:
由於DeleteMin操作需要快速找出根的所有子樹的能力,因此,需要一般樹的標準表示方法:
即每個節點的兒子都存在一個鏈表中,而且每個節點都有一個執行它第一個兒子節點的指針。
該操作還要求諸兒子按照它們的子樹的大小排序(遞減的順序)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章