堆積 (Heap Tree)

Preview:

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

堆積 (Heap Tree)

授課老師:蕭志明

2

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

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

3

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

4

堆積範例

5

堆積範例

6

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

7

堆積操作

8

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

9

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

10

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

新增。 刪除。

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

序)。

11

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

基本的堆積樹演算法

12

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

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

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

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

重新向上堆積 (ReheapUp)

13

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

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

重新向上堆積 (ReheapUp)

14

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

15

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

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

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

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

重新向上堆積 (ReheapUp)

16

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

異 動 前 的 樹 : 不 是 堆 積

最 後 一 個 元 素 向 上 移 動

再 向 上 移 動 : 樹 成 為 堆 積

( 2 5 )

17

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

重新向下堆積 (ReheapDown)

18

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

19

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

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

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

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

重新向下堆積 (ReheapDown)

20

圖 9-7 重新向下堆積

異 動 前 的 樹 : 不 是 堆 積

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

再 向 下 移 動 : 樹 成 為 堆 積

21

Heap 的加入

22

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

23

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

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

24

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

25

Heap 的刪除

26

Heap 的刪除

27

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

28

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

29

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

30

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

15 和 35 交換。

31

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

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

32

何謂 min-heap

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

33

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

34

min-max heap

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 的特性。

36

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

37

min-max heap 的加入

38

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

39

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

40

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

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

41

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

42

min-max heap 的刪除

43

min-max heap 的刪除

44

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

45

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

8取代 40 。

46

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

8 與 19 交換。

47

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

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

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

48

Deap

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

49

Deap

50

Deap

51

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

52

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

53

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

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

54

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

55

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

56

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

57

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

58

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

59

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

p 的定義。

60

Deap 的刪除

61

Deap 的刪除

62

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

63

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

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

64

Deap 的刪除

65

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

66

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

67

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

Recommended