47
Chapter 8 Chapter 8 堆堆 堆堆 8.1 何何何何 8.1 何何何何 8.2 何何 8.2 何何 min-heap min-heap 8.3 min-maxheap 8.3 min-maxheap 8.4 8.4 Deap Deap

Chapter 8 堆積

  • Upload
    cliff

  • View
    87

  • Download
    3

Embed Size (px)

DESCRIPTION

Chapter 8 堆積. 8.1 何謂堆積 8.2 何謂 min-heap 8.3 min-maxheap 8.4 Deap. 堆積 堆積 (Heap) 和二元搜尋樹大致上雷同,但有一點點差異。 Heap 在分類上大致可分為 Max-heap, Min-heap, Min-max heap 及 Deap 。 Heap 也可用在排序上,此稱為 Heap sort (堆積排序)。. 8.1 何謂堆積. 何謂堆積( Heap )? 定義如下: 堆積是一棵二元 樹,其樹根的鍵 值大於子樹的鍵 值,而且必須符 合第六章 6.2 節所 談的完整二元樹。. - PowerPoint PPT Presentation

Citation preview

Page 1: Chapter 8   堆積

Chapter 8 Chapter 8 堆積堆積 8.1 何謂堆積8.1 何謂堆積 8.2 何謂8.2 何謂min-heapmin-heap 8.3 min-maxheap8.3 min-maxheap 8.48.4 Deap Deap

Page 2: Chapter 8   堆積

資料結構 - 使用 C 語言 2

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

in-heap, Min-max heap 及 Deap 。 Heap 也可用在排序上,此稱為 Heap so

rt (堆積排序)。

Page 3: Chapter 8   堆積

資料結構 - 使用 C 語言 3

8.18.1 何謂堆積何謂堆積 何謂堆積( Heap )? 定義如下:堆積是一棵二元樹,其樹根的鍵值大於子樹的鍵值,而且必須符合第六章 6.2 節所談的完整二元樹。

Page 4: Chapter 8   堆積

資料結構 - 使用 C 語言 4

8.18.1 何謂堆積何謂堆積 它是一棵 Heap ,而不是二元搜尋樹。 在調整的過程中有二種方式,一是由上而下,從樹根開始與其子節點相比,若前者大則不用交換,反之,則要交換;以符合父節點大於子節點。

Page 5: Chapter 8   堆積

資料結構 - 使用 C 語言 5

8.18.1 何謂堆積何謂堆積 此種方法也可以讓子節點先比,找出最大者再與其父節點比,此種方法至多只要做一次對調即可,如下圖 23 和 30 中

30 較大,因此 15 和 30 對調。 由於這種方式較快,故若以由上而下調整時,皆以此種方式進行之。

Page 6: Chapter 8   堆積

資料結構 - 使用 C 語言 6

8.18.1 何謂堆積何謂堆積 一棵 Heap 不是唯一,因為只要父節點大於子節點即可。 需在此提醒讀者的是,當中間有某些節點互換時,需要再往上相比較,直到父節點大於子節點為止。

Page 7: Chapter 8   堆積

資料結構 - 使用 C 語言 7

8.18.1 何謂堆積何謂堆積 第二種方法為由下而上,先算出此棵樹的節點數目,假設 n ,再取其,從此節點,開始與它的最大子節點相比,若最大子節點的鍵值大於父節點之鍵值,則相互對調,一直做到樹根止。 記得相互對調後要往下繼續比較,看看是否還要對調喔!

Page 8: Chapter 8   堆積

資料結構 - 使用 C 語言 8

8.18.1 何謂堆積何謂堆積 調整的方法如下:

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

Page 9: Chapter 8   堆積

資料結構 - 使用 C 語言 9

8.18.1 何謂堆積何謂堆積 step 2 : ,故從第 2 節點開始與其較大的子節點相比。由於 40 比 23 大,故調換之。

Page 10: Chapter 8   堆積

資料結構 - 使用 C 語言 10

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

Page 11: Chapter 8   堆積

資料結構 - 使用 C 語言 11

8.18.1 何謂堆積何謂堆積 step 4 :雖然皆已調換完成,但我們發現第

2 節點小於第 4 節點( 15 < 23 ),故需繼續對調,如下圖:

Page 12: Chapter 8   堆積

資料結構 - 使用 C 語言 12

8.18.1 何謂堆積何謂堆積8.1.1 Heap 的加入 承以上的那一棵 Heap ,加入 30 及 50 。 首先按照完整二元樹的特性將 30 加進來,如下圖

Page 13: Chapter 8   堆積

資料結構 - 使用 C 語言 13

8.18.1 何謂堆積何謂堆積

Page 14: Chapter 8   堆積

資料結構 - 使用 C 語言 14

8.18.1 何謂堆積何謂堆積 因為加入 50 後不是一棵 Heap ,所以要加以調整之。

由於原先已是一棵 Heap ,所以,只要將加入的那一個節點往上調整即可。

Page 15: Chapter 8   堆積

資料結構 - 使用 C 語言 15

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

Page 16: Chapter 8   堆積

資料結構 - 使用 C 語言 16

8.18.1 何謂堆積何謂堆積 再刪除 40 ,則將 10 取代之。

Page 17: Chapter 8   堆積

資料結構 - 使用 C 語言 17

8.18.1 何謂堆積何謂堆積 再舉一例,有一棵 Heap 如下:

Page 18: Chapter 8   堆積

資料結構 - 使用 C 語言 18

8.18.1 何謂堆積何謂堆積 今欲將 40 刪除,則以 15 取代 40 (因為

15 在完整二元樹中是最後一個節點)

Page 19: Chapter 8   堆積

資料結構 - 使用 C 語言 19

8.18.1 何謂堆積何謂堆積 此時將 15 和其所屬的最大子節點比較,亦即 15 和 35 (因為它大於 30 )比較,直接將 15 和 35 交換。

Page 20: Chapter 8   堆積

資料結構 - 使用 C 語言 20

8.28.2 何謂何謂 min-heapmin-heap 上述介紹的 Heap ,我們稱之為 max-he

ap ,在 max-heap 樹中的鍵值,一律是上大於下,節點內的鍵值一律大於其子節點。其中 min-heap 的觀念十分簡單,其節點鍵值一律小於子節點,恰與 max-heap 相反,如下圖即為一棵 min-heap的例子。

Page 21: Chapter 8   堆積

資料結構 - 使用 C 語言 21

8.28.2 何謂何謂 min-heapmin-heap

由於其加入與刪除的方法與 max-heap十分類似,在此就不重覆說明了。

Page 22: Chapter 8   堆積

資料結構 - 使用 C 語言 22

8.38.3 min-max heap min-max heap min-max heap 包含了 min-heap 與 max-

heap 兩種 Heap 的特徵。

Page 23: Chapter 8   堆積

資料結構 - 使用 C 語言 23

8.38.3 min-max heap min-max heap 何謂 min-max heap :為了方便解說,我們就直接以上圖為例,來定義 min-max

heap ,必須符合下列三項定義: min-max heap 是以一層 min-heap ,一層

max-heap 交互構成的。 樹中為 min-heap 的部分,仍需符合 min-he

ap 的特性。 樹中為 max-heap 的部分,仍需符合 max-h

eap 的特性。

Page 24: Chapter 8   堆積

資料結構 - 使用 C 語言 24

8.38.3 min-max heap min-max heap8.3.1 min-max heap 的加入 min-max heap 的加入與 max-heap 的原理差不多,但是加入後,要調整至符合上述 min-m

ax heap 的定義。

Page 25: Chapter 8   堆積

資料結構 - 使用 C 語言 25

8.38.3 min-max heap min-max heap 若加入 5 ,步驟如下:

Page 26: Chapter 8   堆積

資料結構 - 使用 C 語言 26

8.38.3 min-max heap min-max heap 加入後 18>5 ,不符合第一項定義,將 5與 18 交換。

Page 27: Chapter 8   堆積

資料結構 - 使用 C 語言 27

8.38.3 min-max heap min-max heap 交換後,由於 10>5 ,不符合第二項定義,將

5 與 10 對調。

此時已符合min-max heap的定義,不須再作調整。

Page 28: Chapter 8   堆積

資料結構 - 使用 C 語言 28

8.38.3 min-max heap min-max heap8.3.2 min-max heap 的刪除 若刪除 min-max heap 的最後一個節點,則直接刪除即可;否則,先將刪除節點鍵值與樹中的最後一個節點對調,再作調整動作,亦即以最後一個節點取代被刪除節點。假設已存在一棵 min-max he

ap 如下:

Page 29: Chapter 8   堆積

資料結構 - 使用 C 語言 29

8.38.3 min-max heap min-max heap

Page 30: Chapter 8   堆積

資料結構 - 使用 C 語言 30

8.38.3 min-max heap min-max heap 若刪除 45 ,則直接刪除。

Page 31: Chapter 8   堆積

資料結構 - 使用 C 語言 31

8.38.3 min-max heap min-max heap 若刪除 40 ,則需以最後一個節點的鍵值

18 取代 40 。

Page 32: Chapter 8   堆積

資料結構 - 使用 C 語言 32

8.38.3 min-max heap min-max heap 交換後 18<19 ,不符合第一項定義,將

18 與 19 交換。

Page 33: Chapter 8   堆積

資料結構 - 使用 C 語言 33

8.38.3 min-max heap min-max heap 交換後,由於 19 小於 32 、 28 、 34 、 31 ,不符合第三項定義,必需將 19 與最大的鍵值 34 交換。

符合 min-max heap 的定義,刪除動作結束。

Page 34: Chapter 8   堆積

資料結構 - 使用 C 語言 34

8.48.4 Deap Deap 何謂 Deap : Deap 同樣也具備 max-heap 與 mi

n-heap 的特徵,其定義如下: Deap 的樹根不儲存任何資料,為一空節點。 樹根的左子樹,為一棵 min-heap ;右子樹則為 max-

heap 。 min-heap 與 max-heap 存在一對應,假設左子樹中有一節點為 i ,則在右子樹中必存在一節點 j 與 i 對應,則 i 必須小於等於 j 。

Page 35: Chapter 8   堆積

資料結構 - 使用 C 語言 35

8.48.4 Deap Deap8.4.1 Deap 的加入 Deap 的加入動作與其它 Heap 一樣,將新的鍵值加入於整棵樹的最後,再調整符合 Deap 的定義,假設已存在一 deap 如右:

Page 36: Chapter 8   堆積

資料結構 - 使用 C 語言 36

8.48.4 Deap Deap 若加入 25 ,加入後右子樹仍為一棵 ma

x-heap ,且左子樹對應節點 15 小於等於它所對應的右子樹節點 25 ,符合 deap 的定義,加入的結果如下:

Page 37: Chapter 8   堆積

資料結構 - 使用 C 語言 37

8.48.4 Deap Deap 加入 17 ,加入後的圖形如下所示:

Page 38: Chapter 8   堆積

資料結構 - 使用 C 語言 38

8.48.4 Deap Deap 此時右子樹仍為 max-heap ,但 17 小於其左子樹的對應節點 20 ,故將 17 與 20交換。

Page 39: Chapter 8   堆積

資料結構 - 使用 C 語言 39

8.48.4 Deap Deap 加入 40 ,如下所示:

Page 40: Chapter 8   堆積

資料結構 - 使用 C 語言 40

8.48.4 Deap Deap 加入後左子樹雖為 min-heap ,但 40 大於其對應節點 25 (與節點 40 的父節點對應之右子樹節點),不符合 deap 的定義,故將 40 與 25交換,如下所示:

Page 41: Chapter 8   堆積

資料結構 - 使用 C 語言 41

8.48.4 Deap Deap 交換後樹中的右子樹不是一棵 max-heap ,重新將其調整為 max-heap 即可。

Page 42: Chapter 8   堆積

資料結構 - 使用 C 語言 42

8.48.4 Deap Deap8.4.2 Deap 的刪除 Deap 的刪除動作與其它 Heap 一樣,當遇到刪除節點非最後一個節點時,要以最後一個節點的鍵值取代刪除節點,並調整至符合 deap的定義,假設存在- Deap 如下:

Page 43: Chapter 8   堆積

資料結構 - 使用 C 語言 43

8.48.4 Deap Deap 若刪除 29 ,則直接刪除即可,結果如下圖所示:

Page 44: Chapter 8   堆積

資料結構 - 使用 C 語言 44

8.48.4 Deap Deap 刪除 21 ,此時以最後一個節點 22 取代之,再將最後一個節點刪除,檢查左子樹仍為一棵 mi

n-heap ,且節點鍵值 22 小於其對應節點 32 ,不需作任何調整。刪除結果如右:

Page 45: Chapter 8   堆積

資料結構 - 使用 C 語言 45

8.48.4 Deap Deap 刪除 12 ,以最後一個節點 27 取代。

Page 46: Chapter 8   堆積

資料結構 - 使用 C 語言 46

8.48.4 Deap Deap 左子樹不符合 min-heap 的定義,將 27子節點中鍵值較小者 16 交換。

Page 47: Chapter 8   堆積

資料結構 - 使用 C 語言 47

8.48.4 Deap Deap 最後 16 與其對應的 30 比較; 16 小於 3

0 ,並且 27 也小於它所對應 max-heap那邊的 30 ,故不需再做調整。