67
堆堆 (Heap Tree) 堆堆堆堆 堆堆堆

堆積 (Heap Tree)

  • Upload
    erwin

  • View
    196

  • Download
    3

Embed Size (px)

DESCRIPTION

堆積 (Heap Tree). 授課老師:蕭志明. 何謂堆積. 堆積 (Heap) 和二元搜尋樹大致上雷同,但有一點點差異。 Heap 在分類上大致可分為 Max-heap, Min-heap, Min-max heap 及 Deap 。 Heap 也可用在排序上,此稱為 Heap sort (堆積排序)。. Definition. 最大樹 ( max tree ) 是一種樹,其中每一個節點的值不小於它的子節點 ( 如果存在的話 ) 的鍵值。   最大累堆 ( max heap ) 為一種也是最大樹的完整二元樹。   - PowerPoint PPT Presentation

Citation preview

Page 1: 堆積 (Heap Tree)

堆積 (Heap Tree)

授課老師:蕭志明

Page 2: 堆積 (Heap Tree)

2

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

eap, Min-max heap 及 Deap 。3. Heap 也可用在排序上,此稱為 Heap sort(堆積排序)。

Page 3: 堆積 (Heap Tree)

3

Definition1. 最大樹 ( max  tree ) 是一種樹,其中每一個節點的值不小於它的子節點 ( 如果存在的話 ) 的鍵值。  2. 最大累堆 ( max heap ) 為一種也是最大樹的完整二元樹。  3. 最小樹 ( min  tree ) 是一種樹,其中每一個節點的值不大於它的子節點 ( 如果存在的話 ) 的鍵值。  最小累堆 ( min heap ) 為一種也是最小樹的完整二元樹。

Page 4: 堆積 (Heap Tree)

4

堆積範例

Page 5: 堆積 (Heap Tree)

5

堆積範例

Page 6: 堆積 (Heap Tree)

6

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

Page 7: 堆積 (Heap Tree)

7

堆積操作

Page 8: 堆積 (Heap Tree)

8

堆積操作 此種方法也可以讓子節點先比,找出最大者再與其父節點比,此種方法至多只要做一次對調即可,如下圖 23 和 30 中 30 較大,因此 15和 30 對調。由於這種方式較快,故若以由上而下調整時,皆以此種方式進行之。

Page 9: 堆積 (Heap Tree)

9

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

Page 10: 堆積 (Heap Tree)

10

基本的堆積樹演算法 1. 堆積樹有二個基本的維護作業:

新增。 刪除。

2. 對堆積樹進行追蹤、搜尋與列印,是沒有意義的。3. 在這一方面,它比較像是一個限制資料結構。4. Heap 也可用在排序上,此稱為 Heap sort (堆積排

序)。

Page 11: 堆積 (Heap Tree)

11

為了實作新增與刪除作業,需要二個基本的演算法:1. 重新向上堆積2. 重新向下堆積。

基本的堆積樹演算法

Page 12: 堆積 (Heap Tree)

12

1. 假設一個類完全二元樹包含 N 個節點,其中 N-1 個節點滿足堆積樹的順序性質,但是最後一個節點不滿足。

2. 換句話說,倘使最後一個節點不存在,則此結構即成為一個堆積樹。3. 重新向上堆積 (ReheapUp) ,將最後一個節點往上移動,直到它

位於正確的位置,以符合堆積的定義。4. 圖 9-4 顯示調整的情況,在進行重新向上堆積樹之前,最後一個節

點的順序不對。而在操作之後,它會位於正確的位置,因此堆積樹也就多了一個節點。

重新向上堆積 (ReheapUp)

Page 13: 堆積 (Heap Tree)

13

1. 新增在葉節點進行。2. 堆積樹是一個完全或類完全樹,新節點必須放在葉階層的第 1 個 ( 最左邊 ) 空位,如圖 9-4 所示。3. 如果新節點的鍵值大於父節點,就交換兩者的資料與鍵值,將新節點往上移動。4. 經由不斷地改變子-父節點的鍵值與資料,新節點最後會到達正確的位置。5. 重新向上堆積 (ReheapUp) 藉由將最後一個節點向上

移動,直到它位於正確的位置,以修復堆積樹的結構。

重新向上堆積 (ReheapUp)

Page 14: 堆積 (Heap Tree)

14

圖 9-4 重新向上堆積作業

Page 15: 堆積 (Heap Tree)

15

圖 9-5 追蹤 ReheapUp 操作。1. 依定義 25 比父節點 12 的左子樹的所有鍵值都大。

於是將 25 與 12 交換。2. 接著發現 25 依然大於其父節點 21 ,所以再交換一

次。3. 最後目標節點鍵值 25 小於父節點鍵值 42 ,表示找

到正確的位置,整個操作結束。

重新向上堆積 (ReheapUp)

Page 16: 堆積 (Heap Tree)

16

圖 9-5 重新向上堆積範例

異 動 前 的 樹 : 不 是 堆 積

最 後 一 個 元 素 向 上 移 動

再 向 上 移 動 : 樹 成 為 堆 積

( 2 5 )

Page 17: 堆積 (Heap Tree)

17

重新向下堆積 (ReheapDown)1. 假設一個類完全二元樹,除了根節點之外,滿足堆積樹的順序性質。2. 這會發生在刪除根節點時,剩下兩個堆積樹。3. 為了修正這種情況,將最後一個節點資料移到根節點。很明顯地,這會破壞堆積樹的性質。 4. 重新向下堆積 (ReheapDown) 由根節點向下移動,一直找到它正確的位置為止。5. 為了修復結構,需要將根節點向下移動,直到它的位置符合堆積樹的順序規定。6. 們稱此作業為重新向下堆積 (ReHeapDown) ,如圖 9-6 所示。

重新向下堆積 (ReheapDown)

Page 18: 堆積 (Heap Tree)

18

圖 9-6 重新向下堆積的例子

Page 19: 堆積 (Heap Tree)

19

1. 圖 9-7 顯示重新向下堆積的作業過程。2. 開始時,根節點 10 小於其子樹,所以要檢查左右子樹,並

選擇比較大的子樹 32 ,與根節點作 交換。3. 圖 9-7(b) 顯示交換之後的情況,繼續檢查子樹以判斷是否

可以結束作業,發現 10 小於其子樹,所以要將 10 與比較大的子樹 30 作交換。

4. 此時,已到達葉節點,所以可以結束作業。

重新向下堆積 (ReheapDown)

Page 20: 堆積 (Heap Tree)

20

圖 9-7 重新向下堆積

異 動 前 的 樹 : 不 是 堆 積

( )根 節 點 向 下 移 動 向 右 下

再 向 下 移 動 : 樹 成 為 堆 積

Page 21: 堆積 (Heap Tree)

21

Heap 的加入

Page 22: 堆積 (Heap Tree)

22

Heap 的加入加入 30 及 50 。 首先按照完整二元樹的特性將 30 加進來, 如下圖

Page 23: 堆積 (Heap Tree)

23

Heap 的加入 因為加入 50 後不是一棵 Heap ,所以要加以調整之。

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

Page 24: 堆積 (Heap Tree)

24

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

Page 25: 堆積 (Heap Tree)

25

Heap 的刪除

Page 26: 堆積 (Heap Tree)

26

Heap 的刪除

Page 27: 堆積 (Heap Tree)

27

Heap 的刪除再刪除 40 ,則將 10取代之。

Page 28: 堆積 (Heap Tree)

28

堆積練習再舉一例,有一棵 Heap 如下:

Page 29: 堆積 (Heap Tree)

29

堆積練習 今欲將 40 刪除,則以 15取代 40 (因為 15在完整二元樹中是最後一個節點)

Page 30: 堆積 (Heap Tree)

30

堆積練習 此時將 15 和其所屬的最大子節點比較,亦即 15 和 35 (因為它大於 30 )比較,直接將

15 和 35 交換。

Page 31: 堆積 (Heap Tree)

31

何謂 min-heap 上述介紹的 Heap ,我們稱之為 max-heap ,在 max-heap 樹中的鍵值,一律是上大於下,節點內的鍵值一律大於其子節點。其中 min-h

eap 的觀念十分簡單,其節點鍵值一律小於子節點,恰與 max-heap 相反,如下圖即為一棵min-heap 的例子。

Page 32: 堆積 (Heap Tree)

32

何謂 min-heap

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

Page 33: 堆積 (Heap Tree)

33

min-max heap min-max heap 包含了 min-heap 與 max-heap兩種 Heap 的特徵

Page 34: 堆積 (Heap Tree)

34

min-max heap

Page 35: 堆積 (Heap Tree)

35

min-max heap 何謂 min-max heap : 為了方便解說,我們就直接以上圖為例,來定義 min-max heap ,必須符合下列三項定義:

1.min-max heap 是以一層 min-heap ,一層 max-heap 交互構成的。

2. 樹中為 min-heap 的部分,仍需符合 min-heap的特性。 3. 樹中為 max-heap 的部分,仍需符合 max-hea

p 的特性。

Page 36: 堆積 (Heap Tree)

36

min-max heap 的加入 min-max heap 的加入與 max-heap 的原理差不多,但是加入後,要調整至符合上述 min-max heap 的定義。

Page 37: 堆積 (Heap Tree)

37

min-max heap 的加入

Page 38: 堆積 (Heap Tree)

38

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

Page 39: 堆積 (Heap Tree)

39

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

Page 40: 堆積 (Heap Tree)

40

min-max heap 的加入 交換後,由於 10>5 ,不符合第二項定義,將 5 與 10 對調。

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

Page 41: 堆積 (Heap Tree)

41

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

Page 42: 堆積 (Heap Tree)

42

min-max heap 的刪除

Page 43: 堆積 (Heap Tree)

43

min-max heap 的刪除

Page 44: 堆積 (Heap Tree)

44

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

Page 45: 堆積 (Heap Tree)

45

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

8取代 40 。

Page 46: 堆積 (Heap Tree)

46

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

8 與 19 交換。

Page 47: 堆積 (Heap Tree)

47

min-max heap 的刪除 交換後,由於 19 小於 32 、 28 、 34 、 3

1 ,不符合第三項定義,必需將 19 與最大的鍵值 34 交換。

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

Page 48: 堆積 (Heap Tree)

48

Deap

Deap 同樣也具備max-heap 與 min-heap 的特徵,其定義如下:1.Deap 的樹根不儲存任何資料,為一空節點。2. 樹根的左子樹,為一棵 min-heap ;右子樹則為 max-heap 。3.min-heap 與 max-heap 存在一對應,假設左子樹中有一節點為 i ,則在右子樹中必存在一節點 j 與 i 對應,則 i 必須小於等於 j 。

Page 49: 堆積 (Heap Tree)

49

Deap

Page 50: 堆積 (Heap Tree)

50

Deap

Page 51: 堆積 (Heap Tree)

51

Deap 的加入Deap 的加入動作與其它 Heap 一樣,將新的鍵值加入於整棵樹的最後,再調整符合 Deap 的定義。

Page 52: 堆積 (Heap Tree)

52

Deap 的加入假設已存在一 deap 如下:

Page 53: 堆積 (Heap Tree)

53

Deap 的加入 若加入 25 ,加入後右子樹仍為一棵 max-

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

Page 54: 堆積 (Heap Tree)

54

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

Page 55: 堆積 (Heap Tree)

55

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

Page 56: 堆積 (Heap Tree)

56

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

Page 57: 堆積 (Heap Tree)

57

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

Page 58: 堆積 (Heap Tree)

58

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

Page 59: 堆積 (Heap Tree)

59

Deap 的刪除 Deap 的刪除動作與其它 Heap 一樣,當遇到刪除節點非最後一個節點時,要以最後一個節點的鍵值取代刪除節點,並調整至符合 dea

p 的定義。

Page 60: 堆積 (Heap Tree)

60

Deap 的刪除

Page 61: 堆積 (Heap Tree)

61

Deap 的刪除

Page 62: 堆積 (Heap Tree)

62

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

Page 63: 堆積 (Heap Tree)

63

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

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

Page 64: 堆積 (Heap Tree)

64

Deap 的刪除

Page 65: 堆積 (Heap Tree)

65

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

Page 66: 堆積 (Heap Tree)

66

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

Page 67: 堆積 (Heap Tree)

67

Deap 的刪除 最後 16 與其對應的 30 比較; 16 小於 30 ,並且 27 也小於它所對應max-heap那邊的 30 ,故不需再做調整。