Chapter 8 堆積

Post on 18-Mar-2016

100 views 2 download

description

Chapter 8 堆積. 何謂堆積. 何謂堆積 (Heap) ? 堆積是一棵二元樹,其樹根的鍵值大於子樹的鍵值, 必須符合完整二元樹的定義 不管左子樹和右子樹的大小順序 ( 與二元搜尋樹最大的差異處 ). 何謂堆積. 堆積 (Heap) 和 二元搜尋樹 大致上雷同,但有一點點差異。 Heap 在分類上大致可分為 Max-heap, Min-heap, Min-max heap 及 Deap 。 Heap 可用在排序上,此稱為 Heap sort (堆積排序)。 一棵 Max-Heap 不是唯一,因為只要父節點大於子節點即可。. 堆積的建立. - PowerPoint PPT Presentation

Transcript of Chapter 8 堆積

Chapter 8 Chapter 8 堆積堆積

何謂堆積何謂堆積 何謂堆積 (Heap) ?

堆積是一棵二元樹,其樹根的鍵值大於子樹的鍵值, 必須符合完整二元樹的定義 不管左子樹和右子樹的大小順序 (與二元搜尋樹最大的差異處 )

何謂堆積何謂堆積 堆積 (Heap) 和二元搜尋樹大致上雷同,但有一點點差異。 Heap 在分類上大致可分為 Max-heap, Min-

heap, Min-max heap 及 Deap 。 Heap 可用在排序上,此稱為 Heap sort (堆積排序)。 一棵 Max-Heap 不是唯一,因為只要父節點大於子節點即可。

堆積的建立堆積的建立 堆積可以用於排序上,簡稱 Heap Sort 。 堆積排序的步驟:

先將資料利用完整二元樹的方式將其建立起來 將建立完成的完整二元樹「調整」成 Heap 以堆疊 (由大到小 )或佇列 (由小到大 )的方式輸出

堆積的建立堆積的建立 堆積的調整方式

由上而下,從樹根開始分別與其子節點相比,若前者大則不用交換,反之,則要交換;以符合父節點大於子節點

3

15

2

1

3 2

1 1

2 3

23 30 15 30 15 23

3023換 換

堆積的調整堆積的調整 (一 ) 為由下而上 : 先算出此棵樹的節點數目,假設 n,再取其 n/2 ,從此節點,開始與它的最大子節點相比,若最大子節點的鍵值大於父節點之鍵值,則相互對調,一直做到樹根止。應注意的是,若相互對調後要往下繼續比較,調整的方法如下:

堆積的調整堆積的調整 step 1 :先將每一節點按完整二元樹的順序加以編號如下圖:

15

23 20

40 8 10

1

2 3

4 5 6

堆積的調整堆積的調整 step 2 : 6/2 ,故從第 3 節點開始與其較大的子節點相比。由於 20 比 10 大,故調換之。

15

23 10

40 8 20

1

2 3

4 5 620

10

堆積的調整堆積的調整 step 3 :接下來將第 2 個節點與其較大子節點比,我們發現 40 大於 23 ,故調換之,如下圖:

15

23

40 8

1

2 3

4 5 620

10

40

23

堆積的調整堆積的調整 step 4 :接下來將第 1 個節點與其較大子節點比,我們發現 40 大於 15 ,故調換之,如下圖:

15

8

1

2 3

4 5 620

10

40

23

40

15

堆積的調整堆積的調整 step 5 :雖然皆已調換完成,但因為第 2 節點小於第 4 節點( 15 < 23 ),故需繼續對調,如下圖:

8

2 3

4 5 620

1023

40

15

8

2 3

4 5 620

1015

40

23

堆積的加入堆積的加入 先按照建立一棵完整二元樹的特性將資料加入 判斷加入後的二元樹是否為一棵堆積樹,若符合則完成加入;若否,則再加以調整之。 假設有一棵 Heap ,加入 30 及 50 。 首先按照完整二元樹的特性將 30 加進來,如下圖:

堆積的加入堆積的加入40

23 10

15 8 30

40

23

1015 8

30

堆積的加入堆積的加入40

23

1015 8

30

50

50

23

1015 8

40

30

50

30

堆積的刪除堆積的刪除 Heap 的刪除則將完整二元樹的最後一節點取代被刪除的節點,然後判斷是否為一棵 Heap ,若否,則再依上述的方法加以調整之。

40

30 20

15 10

40

10 20

15

刪除 30

調整

堆積的刪除堆積的刪除40

15 20

10

10

15 20

刪除 40

20

15 10

調整

何謂何謂 min-heapmin-heap

上述介紹的 Heap ,稱之為 max-heap , 在 max-heap 樹中的鍵值,一律是上大於下,節點內的鍵值一律大於其子節點。 而 min-heap ,其節點鍵值一律小於子節點,恰與 max-heap 相反。 加入與刪除的方法與 max-heap 十分類似。

DeapDeap Deap 同樣也具備了 Max-heap 與 Min-heap的特徵,其定義如下:

Deap 的樹根不存任何資料,為一個空節點。 樹根的左子樹為一棵 Min-heap ;右子樹為

Max-heap 。 Max-heap 與 Min-heap 存在一對應,假設左子樹中有一節點 i,則在右子樹中相同的位置存在一節點 j與 i對應,且 i必須小於等

於 j。如下圖。

DeapDeap

5

12 21

18 16 2725

35

30 32

22 29

DeapDeap 的加入與刪除的加入與刪除 加入與刪除的動作與堆積樹一樣。 將新的鍵值加入於整顆樹的最後,再調整至符合堆積樹的定義。 刪除時,當遇到刪除節點非最後一個節點時,要以最後一個節點的鍵值取代節點。