56
1 第第 Heap 第第

第十一章 Heap 結構

  • Upload
    damia

  • View
    97

  • Download
    0

Embed Size (px)

DESCRIPTION

第十一章 Heap 結構. 目次. 11.1 Min-Max heap 11.2 Deap 11.3 Binomial heap 11.4 Fibonacci heap 11.5 動動腦時間 11.6 練習題解答. 10. 40. 45. 15. 19. 18. 13. Level 1. min. 32. 24. 28. 31. 33. 35. 34. 42. Level 2. max. min. Level 3. max. Level 4. 11.1 Min-max heap. - PowerPoint PPT Presentation

Citation preview

Page 1: 第十一章   Heap  結構

1

第十一章 Heap 結構

Page 2: 第十一章   Heap  結構

2

目次

11.1 Min-Max heap

11.2 Deap

11.3 Binomial heap

11.4 Fibonacci heap

11.5 動動腦時間11.6 練習題解答

Page 3: 第十一章   Heap  結構

3

11.1 Min-max heap

Min-max heap – 它包含了 min-heap 與 max-heap 兩種堆積樹的特徵,

如下圖即為一棵 min-max heap : 10

40 45

19 13 18 15

32 28 34 31 24 35 42 33

Level 1

Level 2

Level 3

Level 4

min

max

min

max

Page 4: 第十一章   Heap  結構

4

11.1 Min-max heap (con.t)

Min-max heap 的特性– min-max heap 是以一層 min-heap 、 max-heap 交互構成的

Level1 中各節點的鍵值一律小於子節點 (10 小於 40 、 45) , Level2 中各節點的鍵值一律大於子節點 (40 大於 19 、 13 ;

45 大於 18 、 15)

– 樹中為 min-heap 的部分,仍需符合 min-heap 的特性 如圖 Level 1 的節點鍵值,會小於 Level 為 3 的子樹 (10 小

於 19 、 13 、 18 、 15)

– 樹中為 max-heap 的部份,仍需符合 max-heap 的特性 如圖的 Level 2 的節點鍵值,會大於 Level 為 4 之子樹 (40

大於 32 、 28 、 34 、 31 ; 45 大於 24 、 35 、 42 、 33)

Page 5: 第十一章   Heap  結構

5

11.1 Min-max heap (con.t)

11.1.1   Min-max heap 的加入 min-max heap 的加入

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

– 假設已存在一棵 min-max heap 如下:10

40 45

19 13 18 15

32 28 34 31

min

max

min

max

Page 6: 第十一章   Heap  結構

6

11.1 Min-max heap (con.t)

– 若加入 5 ,步驟如下

40 45

19 13 18 15

32 28 34 31 5

10 min

max

min

max

Page 7: 第十一章   Heap  結構

7

11.1 Min-max heap (con.t)

– 加入後 18>5 ,不符合第一項定義,將 5 與 18 交換

40 45

19 13 5 15

32 28 34 31 18

10 min

max

min

max

Page 8: 第十一章   Heap  結構

8

11.1 Min-max heap (con.t)

– 交換後,由於 10>5 ,不符合第二項定義,將 5 與 10 對調 min

max

min

max

40 45

19 13 10 15

32 28 34 31 18

5

Page 9: 第十一章   Heap  結構

9

11.1 Min-max heap (con.t)

– 符合 min-max heap 的定義,加入動作結束。若再加入 50 ,其加入步驟如下 :

min

max

min

max

40 45

19 13 10 15

32 28 34 31 18

5

50

Page 10: 第十一章   Heap  結構

10

11.1 Min-max heap (con.t)

– 加入後 45<50 ,不符合第三項定義,將 45 與 50 交換

– 符合 min-max heap 的定義,加入動作結束

min

max

min

max

40 50

19 13 10 15

32 28 34 31 18

5

45

Page 11: 第十一章   Heap  結構

11

11.1 Min-max heap (con.t)

11.1.2 Min-max heap 的刪除 min-max heap 的刪除

– 若刪除最後一個節點,則直接刪除即可 – 否則,先將刪除節點鍵值與樹中的最後一個節點對調,

再作調整動作,意即以最後一個節點取代被刪除節點 假設已存在一棵 min-max heap 如下:

40 50

19 13 10 15

32 28 34 31 18

5

45

min

max

min

max

Page 12: 第十一章   Heap  結構

12

11.1 Min-max heap (con.t)

– 若刪除 45 ,則直接刪除

40 50

19 13 10 15

32 28 34 31 18

5 min

max

min

max

Page 13: 第十一章   Heap  結構

13

11.1 Min-max heap (con.t)

– 若刪除 40 ,則需以最後一個節點的鍵值 18 取代 40min

max

min

max

18 50

19 13 10 15

32 28 34 31

5

Page 14: 第十一章   Heap  結構

14

11.1 Min-max heap (con.t)

– 交換後 18<19 ,不符合第一項定義,將 18 與 19 交換min

max

min

max

19 50

18 13 10 15

32 28 34 31

5

Page 15: 第十一章   Heap  結構

15

11.1 Min-max heap (con.t)

– 交換後,由於 19 小於 32 、 28 、 34 、 31 ,不符合第三項定義,將 19 與最大的鍵值 34 交換

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

min

max

min

max

34 50

18 13 10 15

32 28 19 31

5

Page 16: 第十一章   Heap  結構

16

11.2 Deap

Deap– 同樣也具備 max-heap 與 min-heap 的特徵,其定義如下:

Deap 的樹根不儲存任何資料,為一空節點。 樹根的左子樹為一棵 min-heap ;右子樹則為 max-heap 。 min-heap 與 max-heap 存在一對應,假設左子樹中有一節

點為 i ,則在右子樹中相同的位置存在一節點 j 與 i 對應,且 i 必須小於等於 j 。如圖的 5 與 35 對應, 5 小於 35 ;12 與 30 對應, 12 小於 30 5 35

12 21 30 32

18 16 25 27 22 29

Page 17: 第十一章   Heap  結構

17

11.2 Deap (con.t)

11.2.1 Deap 的加入 Deap 的加入

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

假設已存在一 Deap 如下:

5 30

15 20

Page 18: 第十一章   Heap  結構

18

11.2 Deap (con.t)

– 若加入 25 ,加入後右子樹仍為一棵 max-heap ,如下所示,且左子樹對應節點 15 小於等於它所對應的右子樹節點 25 ,符合 deap 的定義

5 30

15 20 25

Page 19: 第十一章   Heap  結構

19

11.2 Deap (con.t)

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

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

5 30

15 20 25 17

5 30

15 17 25 20

Page 20: 第十一章   Heap  結構

20

11.2 Deap (con.t)

– 加入 40 ,如下所示

5 30

15 17 25 20

40

Page 21: 第十一章   Heap  結構

21

11.2 Deap (con.t)

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

5 30

15 17 40 20

25

Page 22: 第十一章   Heap  結構

22

11.2 Deap (con.t)

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

5 40

15 17 30 20

25

Page 23: 第十一章   Heap  結構

23

11.2 Deap (con.t)

11.2.2 Deap 的刪除 Deap 的刪除

– Deap 的刪除動作與其它堆積樹一樣,當遇到刪除節點非最後一個節點時,要以最後一個節點的鍵值取代刪除節點,並調整至符合 deap 的定義

假設存在一 deap 如下: 5 35

12 21 30 32

18 16 25 27 22 29

Page 24: 第十一章   Heap  結構

24

11.2 Deap (con.t)

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

5 35

12 21 30 32

18 16 25 27 22

Page 25: 第十一章   Heap  結構

25

11.2 Deap (con.t)

– 刪除 21 ,此時以最後一個節點 22 取代之,再將最後一個節點刪除,檢查左子樹仍為一棵 min-heap ,且節點鍵值 22 小於其對應節點 32 ,不需作任何調整。刪除結果如下

5 35

12 22 30 32

18 16 25 27

Page 26: 第十一章   Heap  結構

26

11.2 Deap (con.t)

– 刪除 12 ,以最後一個節點 27 取代

5 35

27 22 30 32

18 16 25

Page 27: 第十一章   Heap  結構

27

11.2 Deap (con.t)

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

– 最後 16 與其對應的 30 比較; 16 小於 30 ,故不需再做調整

5 35

16 22 30 32

18 27 25

Page 28: 第十一章   Heap  結構

28

11.3 Binomial heap

Binomial heap– Binomial heap 是由一些 Binomial tree 所組成的集合 – 一棵 Binomial tree (Bk) 具有那些特徵:

Bk 的 Binomial tree 含有二棵 Bk-1 的 Binomial tree 。 Bk 的 Binomial tree 具有 2k 的節點數,如下所示

B0 B1 B2 B3

Page 29: 第十一章   Heap  結構

29

11.3 Binomial heap (con.t)

Bk 的高度為 k ,如 B3 表示此棵 Binomial tree 的高度為 3

在高度為 i 的那一層共有 k! / i!(k-i)! 個節點

高度 0

1

2

3

4

2

Page 30: 第十一章   Heap  結構

30

11.3 Binomial heap (con.t)

11.3.1 合併的動作 假設有二棵 Binomial heap ,如下圖所示:

7

13

19

15

1

23

12head[H1]

5

45

19

39 28

44

31

3

37

18head[H2]

50

Page 31: 第十一章   Heap  結構

31

11.3 Binomial heap (con.t)

– 將它們化為一棵 Binomial heap ,由左至右按照其 degree由小至大排列之

6

45

30 10 44

31

1

23

18head[H]

50

12 3

37

28

13

7

15

19

Page 32: 第十一章   Heap  結構

32

11.3 Binomial heap (con.t)

– 將 degree 相同的合併,並且注意較小的鍵值放在上面,重複此步驟直到沒有相同的 degree 為止。首先將 degree為 0 的 Binomial tree 合併

6

45

30 10 44

31

1

2318

head[H]

50

12 3

37

28

13

7

15

19

Page 33: 第十一章   Heap  結構

33

11.3 Binomial heap (con.t)

– 再將 degree 為 1 的 Binomial tree 合併,由於有 3 棵 Binomial tree 的 degree 為 1 ,因此我們必須先判斷 root 的鍵值為較小的二棵 Binomial tree ,然後將這二棵 Binomial tree 中較大的加在較小的 Binomial tree 下方,如下圖所示:

6

45

30 10 44

31

1

2318

head[H]

50

12

3

37 28

13

7

15

19

Page 34: 第十一章   Heap  結構

34

11.3 Binomial heap (con.t)

– 再將 degree 為 2 的合併 6

45

30 10 44

31

1

2318

head[H]

50

12

3

37 2813

7

15

19

Page 35: 第十一章   Heap  結構

35

11.3 Binomial heap (con.t)

– 再將 degree 為 3 的合併

– 此時就大功告成了,其 Big-O 為 O( log n)

6

45

30 10 44

31

1

2318

head[H]

50

12

3

37

28

13

7

15

19

Page 36: 第十一章   Heap  結構

36

11.3 Binomial heap (con.t)

11.3.2 加入的動作 將一節點加入到 Binomial heap ,有二個步驟:

– 將它加入到 head[H] 指向 Binomial tree 之樹根的鏈結串列中

– 執行合併的動作。

Page 37: 第十一章   Heap  結構

37

11.3 Binomial heap (con.t)

– 下面舉個例子來說明上述的步驟,將圖 11.1 加入一節點,其鍵值為 18 ,則加入於 head[H] 指向的樹根串列中

7

11

8 13 15

17

1

23

18head[H]

28

12

10

16 19

Page 38: 第十一章   Heap  結構

38

11.3 Binomial heap (con.t)

– 利用上述合併的動作,將按照 degree 的大小排列,再進行合併

– 由於 12 和 18 的 degree 皆為 0 ,故合併之,將 18 加入到12 的下方,因為 18 大於 12 。其 Big-O 為 O( log n)

7

11

8 13 15

17

1

2318

head[H]

28

12

10

16 19

Page 39: 第十一章   Heap  結構

39

11.3 Binomial heap (con.t)

11.3.3 刪除的動作 刪除的動作

– 一般刪除的動作乃是擷取此棵 Binomial heap 的最小值出來,因此只要從 head[H] 指向的鏈結串列中就可找到最小的值在那一棵 Binomial tree ,此時將此節點刪除之即可

如有一棵 Binomial heap 如下 :7

11

8 13 15

17

1

23

head[H]

28

12

10

16 19

Page 40: 第十一章   Heap  結構

40

11.3 Binomial heap (con.t)

– 將最小的鍵值 1 刪除,則為 7

11

8 13 15

17

10

16

head[H]

28

12 23

19

Page 41: 第十一章   Heap  結構

41

11.3 Binomial heap (con.t)

– 因為在刪除 1 之後, Binomial heap 中有 degree 相同的 Binomial tree ,因此要執行合併的動作

7

11

8 13 15

17

10

16

head[H]

28

12

23

19

Page 42: 第十一章   Heap  結構

42

11.3 Binomial heap (con.t)

– 而刪除動作的 Big-O 也是 O( log n)

7

11

8 13 15

17

10

16

head[H]

28

12

23 19

Page 43: 第十一章   Heap  結構

43

11.4 Fibonacci heap

Fibonacci heap 的類型– max F-heap :若 parent 節點的鍵值皆大於 child 節點的鍵

值,則稱此棵樹為 max F-heap – min F-heap :若 parent 節點的鍵值皆小於 child 節點的鍵值,

則稱此棵樹為 min F-heap 有一棵 F-heap 如下所示:

20

37

18 22 42

39

2

50

6

16

31

12 15

36

min[H]

Page 44: 第十一章   Heap  結構

44

11.4 Fibonacci heap (con.t)

– 每一節點的資料結構如下:parent

Llink key Rlink

Children

Page 45: 第十一章   Heap  結構

45

11.4 Fibonacci heap (con.t)

11.4.1 加入的動作 加入的動作

– 假設現在有一棵 F-heap ,如下圖所示

20

37

28 22 42

39

2

50

6

16

31

12 15

36

min[H]

Page 46: 第十一章   Heap  結構

46

11.4 Fibonacci heap (con.t)

– 加入 77

– 只要將 77 加入到 root 串列中,再看看它是否比 min[H] 來得小,若是,則將 min[H] 指向此新加入的鍵值。加入後不需要作合併的動作。而此加入動作的 Big-O 為 O(1)

20

37

28 22 42

39

2

50

77

16

31

6 15

36

min[H]

12

Page 47: 第十一章   Heap  結構

47

11.4 Fibonacci heap (con.t)

11.4.2 擷取 F-heap 中的最小值 擷取 F-heap 中的最小值

– 擷取 min[H] 所指向的節點 假設有一 F-heap ,如下圖所示:

– 今將擷取 min[H] 即為鍵值為 2 的節點

20

37

22 42

39

2

50

6

16

31

36

min[H]

Page 48: 第十一章   Heap  結構

48

11.4 Fibonacci heap (con.t)

– 刪除鍵值 2 的節點後,此時的 F-heap 為

20

37 22 42

36

39

5016

31

6

min[H]

Page 49: 第十一章   Heap  結構

49

11.4 Fibonacci heap (con.t)

– 因為刪除鍵值 2 後,有相同的 degree 的樹,所以將其合併之。合併的動作與 Binomial heap 的合併動作相同,在此不再贅述

20

37 22 42

36

39

16

31

6

50

min[H]

20

50 22 42

36

39

6

31

16

37

min[H]

Page 50: 第十一章   Heap  結構

50

11.4 Fibonacci heap (con.t)

– 而刪除動作的 Big-O 為 O( log n)

20

22 42

36

39

31

6

5016

37

min[H]

Page 51: 第十一章   Heap  結構

51

11.4 Fibonacci heap (con.t)

– 而刪除動作的 Big-O 為 O( log n)

20

22 42

36

39

31

6

5016

37

min[H]

Page 52: 第十一章   Heap  結構

52

11.4 Fibonacci heap (con.t)

11.4.3 減少某鍵值的值 減少某鍵值的值

– 將圖 11.2 的鍵值 16 減少 15 ,使其為 1 。– 首先與 parent node 相比,若較小,則刪除此節點與父節點

和兄弟節點的指標,此時將此節點和其子節點 ( 若有的話 )獨立出來,並將其加入 root 集合中。

– 並重新掃瞄 root 串列中的最小值為何,之後將 min[H] 指向它

Page 53: 第十一章   Heap  結構

53

11.4 Fibonacci heap (con.t)

– 其結果如下圖所示:

– 若減少某一鍵值 (decrease key) 之後,其值還是比 parent 來得大,則不需調整之。此一減少某鍵值的值之 Big-O 為 O(1)

20

28 22 42

39

26

50

31

15

36

12 1

min[H]

37

Page 54: 第十一章   Heap  結構

54

11.4 Fibonacci heap (con.t)

11.4.4 刪除的動作 刪除的動作:

– 刪除的節點若為最小值,即和擷取最小值的情況是一樣的,刪除此節點並將其所屬的 child node 為此棵樹的 root ,重新連結這些節點,如將圖 11.2 刪除節點 2 ,則將成為下圖所示

20

28 22 4239

166

31

15

37

12 3650

min[H]

Page 55: 第十一章   Heap  結構

55

11.4 Fibonacci heap (con.t)

– 並重新選擇 root 中最小值為 6 ,因此 min[H] 指向此節點,之後再進行合併的動作

– 若刪除的不是最小值的話,如刪除圖 11.2 中的 16 ,則成為

20

28 22 42

39

26

50

31

15

36

12 37

min[H]

Page 56: 第十一章   Heap  結構

56

11.4 Fibonacci heap (con.t)

– 亦即從 double circular list 中刪除掉,然後將其 children node 成為 root 集合中的一員,如刪除 16 ,則 37 就會成為 root 集合中的一員,並選擇 root 集合中最小的一員當其 min[H] ,之後再進行合併的動作

– 而此刪除動作的 Big-O 為 O( log n)