chapter 8 堆積

20
Chapter 8 Chapter 8 堆堆 堆堆

Upload: lowri

Post on 18-Mar-2016

104 views

Category:

Documents


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

Page 1: Chapter 8   堆積

Chapter 8 Chapter 8 堆積堆積

Page 2: Chapter 8   堆積

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

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

Page 3: Chapter 8   堆積

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

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

Page 4: Chapter 8   堆積

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

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

Page 5: Chapter 8   堆積

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

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

3

15

2

1

3 2

1 1

2 3

23 30 15 30 15 23

3023換 換

Page 6: Chapter 8   堆積

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

Page 7: Chapter 8   堆積

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

15

23 20

40 8 10

1

2 3

4 5 6

Page 8: Chapter 8   堆積

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

15

23 10

40 8 20

1

2 3

4 5 620

10

Page 9: Chapter 8   堆積

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

15

23

40 8

1

2 3

4 5 620

10

40

23

Page 10: Chapter 8   堆積

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

15

8

1

2 3

4 5 620

10

40

23

40

15

Page 11: Chapter 8   堆積

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

8

2 3

4 5 620

1023

40

15

8

2 3

4 5 620

1015

40

23

Page 12: Chapter 8   堆積

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

Page 13: Chapter 8   堆積

堆積的加入堆積的加入40

23 10

15 8 30

40

23

1015 8

30

Page 14: Chapter 8   堆積

堆積的加入堆積的加入40

23

1015 8

30

50

50

23

1015 8

40

30

50

30

Page 15: Chapter 8   堆積

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

40

30 20

15 10

40

10 20

15

刪除 30

調整

Page 16: Chapter 8   堆積

堆積的刪除堆積的刪除40

15 20

10

10

15 20

刪除 40

20

15 10

調整

Page 17: Chapter 8   堆積

何謂何謂 min-heapmin-heap

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

Page 18: Chapter 8   堆積

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

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

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

於 j。如下圖。

Page 19: Chapter 8   堆積

DeapDeap

5

12 21

18 16 2725

35

30 32

22 29

Page 20: Chapter 8   堆積

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