第十一章
This presentation is the property of its rightful owner.
Sponsored Links
1 / 56

第十一章 Heap 結構 PowerPoint PPT Presentation


  • 120 Views
  • Uploaded on
  • Presentation posted in: General

第十一章 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.

Download Presentation

第十一章 Heap 結構

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Heap

第十一章 Heap 結構


Heap

目次

11.1 Min-Max heap

11.2 Deap

11.3 Binomial heap

11.4 Fibonacci heap

11.5 動動腦時間

11.6 練習題解答


11 1 min max heap

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

  • Min-max heap

    • 它包含了 min-heap 與 max-heap 兩種堆積樹的特徵,如下圖即為一棵min-max heap:


11 1 min max heap con t

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)


11 1 min max heap con t1

min

max

min

10

40

45

max

15

19

13

18

32

28

31

34

11.1 Min-max heap (con.t)

11.1.1Min-max heap的加入

  • min-max heap的加入

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

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


11 1 min max heap con t2

10

40

45

min

max

15

19

18

13

min

max

32

5

28

31

34

11.1 Min-max heap (con.t)

  • 若加入5,步驟如下


11 1 min max heap con t3

min

10

max

40

45

19

5

15

13

min

32

18

28

31

34

max

11.1 Min-max heap (con.t)

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


11 1 min max heap con t4

min

max

min

max

5

40

45

15

19

10

13

32

18

28

31

34

11.1 Min-max heap (con.t)

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


11 1 min max heap con t5

min

max

5

min

max

40

45

15

19

10

13

32

18

50

28

31

34

11.1 Min-max heap (con.t)

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


11 1 min max heap con t6

min

max

min

max

5

40

50

15

19

10

13

45

32

18

28

31

34

11.1 Min-max heap (con.t)

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

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


11 1 min max heap con t7

min

max

min

max

5

40

50

19

13

15

10

32

18

31

45

28

34

11.1 Min-max heap (con.t)

11.1.2 Min-max heap的刪除

  • min-max heap的刪除

    • 若刪除最後一個節點,則直接刪除即可

    • 否則,先將刪除節點鍵值與樹中的最後一個節點對調,再作調整動作,意即以最後一個節點取代被刪除節點

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


11 1 min max heap con t8

min

max

min

max

5

40

50

15

19

10

13

32

18

28

31

34

11.1 Min-max heap (con.t)

  • 若刪除45,則直接刪除


11 1 min max heap con t9

min

max

min

max

5

50

18

15

19

13

10

32

28

31

34

11.1 Min-max heap (con.t)

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


11 1 min max heap con t10

min

max

min

max

5

50

19

15

18

10

13

32

28

31

34

11.1 Min-max heap (con.t)

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


11 1 min max heap con t11

min

max

min

max

5

50

34

15

18

10

13

32

28

31

19

11.1 Min-max heap (con.t)

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

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


11 2 deap

5

35

32

12

30

21

18

16

27

25

22

29

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


11 2 deap con t

5

30

15

20

11.2 Deap (con.t)

11.2.1 Deap 的加入

  • Deap 的加入

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

  • 假設已存在一 Deap 如下:


11 2 deap con t1

5

30

25

15

20

11.2 Deap (con.t)

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


11 2 deap con t2

5

30

25

15

20

17

5

30

25

15

17

20

11.2 Deap (con.t)

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

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


11 2 deap con t3

5

30

25

15

20

17

40

11.2 Deap (con.t)

  • 加入40,如下所示


11 2 deap con t4

5

30

40

15

20

17

25

11.2 Deap (con.t)

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


11 2 deap con t5

5

40

30

15

20

17

25

11.2 Deap (con.t)

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


11 2 deap con t6

5

35

30

12

32

21

27

18

25

29

22

16

11.2 Deap (con.t)

11.2.2 Deap 的刪除

  • Deap 的刪除

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

  • 假設存在一deap如下:


11 2 deap con t7

5

35

30

12

32

21

27

18

25

22

16

11.2 Deap (con.t)

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


11 2 deap con t8

5

35

30

12

32

22

27

18

25

16

11.2 Deap (con.t)

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


11 2 deap con t9

5

35

30

27

32

22

18

25

16

11.2 Deap (con.t)

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


11 2 deap con t10

5

35

30

16

32

22

18

25

27

11.2 Deap (con.t)

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

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


11 3 binomial heap

B1

B2

B3

B0

11.3 Binomial heap

  • Binomial heap

    • Binomial heap是由一些Binomial tree所組成的集合

    • 一棵Binomial tree (Bk)具有那些特徵:

      • Bk的Binomial tree含有二棵Bk-1的Binomial tree。

      • Bk的Binomial tree具有2k的節點數,如下所示


11 3 binomial heap con t

0

1

2

3

11.3 Binomial heap (con.t)

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

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

高度


11 3 binomial heap con t1

1

12

head[H1]

7

23

13

15

19

3

18

head[H2]

5

37

19

44

39

28

45

31

50

11.3 Binomial heap (con.t)

11.3.1 合併的動作

  • 假設有二棵Binomial heap,如下圖所示:


11 3 binomial heap con t2

1

3

6

12

18

head[H]

7

30

10

44

37

13

23

15

45

28

31

19

50

11.3 Binomial heap (con.t)

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


11 3 binomial heap con t3

1

3

6

7

12

head[H]

13

30

10

44

23

37

15

18

19

45

28

31

50

11.3 Binomial heap (con.t)

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


11 3 binomial heap con t4

1

6

7

12

head[H]

3

13

30

10

44

23

15

18

37

19

45

28

31

50

11.3 Binomial heap (con.t)

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


11 3 binomial heap con t5

1

6

12

head[H]

3

7

30

10

44

23

18

37

15

13

28

31

45

19

50

11.3 Binomial heap (con.t)

  • 再將degree為2的合併


11 3 binomial heap con t6

1

12

head[H]

3

7

6

23

18

30

13

10

44

15

37

31

45

19

28

50

11.3 Binomial heap (con.t)

  • 再將degree為3的合併

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


11 3 binomial heap con t7

11.3 Binomial heap (con.t)

11.3.2 加入的動作

  • 將一節點加入到Binomial heap,有二個步驟:

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

    • 執行合併的動作。


11 3 binomial heap con t8

1

18

7

12

head[H]

10

8

13

15

23

16

17

11

19

28

11.3 Binomial heap (con.t)

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


11 3 binomial heap con t9

1

7

12

head[H]

18

10

8

13

15

23

16

17

11

19

28

11.3 Binomial heap (con.t)

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

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


11 3 binomial heap con t10

1

7

12

head[H]

10

8

13

15

23

16

17

11

19

28

11.3 Binomial heap (con.t)

11.3.3 刪除的動作

  • 刪除的動作

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

  • 如有一棵Binomial heap如下 :


11 3 binomial heap con t11

10

7

12

23

head[H]

8

13

15

16

17

11

19

28

11.3 Binomial heap (con.t)

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


11 3 binomial heap con t12

10

7

12

head[H]

8

13

15

16

23

17

11

19

28

11.3 Binomial heap (con.t)

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


11 3 binomial heap con t13

10

7

head[H]

12

8

13

15

16

17

11

19

23

28

11.3 Binomial heap (con.t)

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


11 4 fibonacci heap

min[H]

15

2

20

12

6

36

18

22

42

50

16

39

37

31

11.4 Fibonacci heap

  • Fibonacci heap的類型

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

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

  • 有一棵F-heap如下所示:


11 4 fibonacci heap con t

11.4 Fibonacci heap (con.t)

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


11 4 fibonacci heap con t1

min[H]

15

2

12

20

6

36

28

22

42

50

16

39

37

31

11.4 Fibonacci heap (con.t)

11.4.1 加入的動作

  • 加入的動作

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


11 4 fibonacci heap con t2

min[H]

15

2

20

12

6

77

36

28

22

42

50

16

39

37

31

11.4 Fibonacci heap (con.t)

  • 加入77

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


11 4 fibonacci heap con t3

min[H]

2

20

6

36

22

42

50

16

39

37

31

11.4 Fibonacci heap (con.t)

11.4.2 擷取F-heap 中的最小值

  • 擷取F-heap 中的最小值

    • 擷取min[H]所指向的節點

  • 假設有一F-heap,如下圖所示:

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


11 4 fibonacci heap con t4

min[H]

20

36

50

16

6

39

37

22

42

31

11.4 Fibonacci heap (con.t)

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


11 4 fibonacci heap con t5

min[H]

min[H]

36

16

6

20

36

6

20

22

42

39

50

37

16

22

42

39

50

31

37

31

11.4 Fibonacci heap (con.t)

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


11 4 fibonacci heap con t6

min[H]

36

6

16

20

39

50

22

42

37

31

11.4 Fibonacci heap (con.t)

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


11 4 fibonacci heap con t7

min[H]

36

6

16

20

39

50

22

42

37

31

11.4 Fibonacci heap (con.t)

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


11 4 fibonacci heap con t8

11.4 Fibonacci heap (con.t)

11.4.3 減少某鍵值的值

  • 減少某鍵值的值

    • 將圖11.2的鍵值16減少15,使其為1。

    • 首先與parent node相比,若較小,則刪除此節點與父節點和兄弟節點的指標,此時將此節點和其子節點(若有的話)獨立出來,並將其加入root集合中。

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


11 4 fibonacci heap con t9

min[H]

15

1

2

20

6

12

37

36

28

22

42

50

39

31

11.4 Fibonacci heap (con.t)

  • 其結果如下圖所示:

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


11 4 fibonacci heap con t10

min[H]

15

50

36

16

20

6

12

39

37

28

22

42

31

11.4 Fibonacci heap (con.t)

11.4.4 刪除的動作

  • 刪除的動作:

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


11 4 fibonacci heap con t11

min[H]

15

37

2

20

6

12

36

28

22

42

50

39

31

11.4 Fibonacci heap (con.t)

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

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


11 4 fibonacci heap con t12

11.4 Fibonacci heap (con.t)

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

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


  • Login