1 / 56

第十一章 Heap 結構

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

damia
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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十一章 Heap 結構

  2. 目次 11.1 Min-Max heap 11.2 Deap 11.3 Binomial heap 11.4 Fibonacci heap 11.5 動動腦時間 11.6 練習題解答

  3. 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:

  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)

  5. 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如下:

  6. 10 40 45 min max 15 19 18 13 min max 32 5 28 31 34 11.1 Min-max heap (con.t) • 若加入5,步驟如下

  7. 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交換

  8. 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對調

  9. 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,其加入步驟如下 :

  10. 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. 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如下:

  12. min max min max 5 40 50 15 19 10 13 32 18 28 31 34 11.1 Min-max heap (con.t) • 若刪除45,則直接刪除

  13. 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

  14. 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交換

  15. 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 的定義,刪除動作結束

  16. 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

  17. 5 30 15 20 11.2 Deap (con.t) 11.2.1 Deap 的加入 • Deap 的加入 • Deap 的加入動作與其它堆積樹一樣,將新的鍵值加入於整棵樹的最後,再調整至符合堆積樹的定義 • 假設已存在一 Deap 如下:

  18. 5 30 25 15 20 11.2 Deap (con.t) • 若加入25,加入後右子樹仍為一棵max-heap,如下所示,且左子樹對應節點15小於等於它所對應的右子樹節點25,符合deap的定義

  19. 5 30 25 15 20 17 5 30 25 15 17 20 11.2 Deap (con.t) • 加入17,加入後的圖形如下所示 • 此時右子樹仍為max-heap,但17小於其左子樹的對應節點20,故將17與20交換

  20. 5 30 25 15 20 17 40 11.2 Deap (con.t) • 加入40,如下所示

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

  22. 5 40 30 15 20 17 25 11.2 Deap (con.t) • 交換後樹中的右子樹不是一棵max-heap,重新將其調整為max-heap即可

  23. 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如下:

  24. 5 35 30 12 32 21 27 18 25 22 16 11.2 Deap (con.t) • 若刪除29,則直接刪除即可,結果如下圖所示

  25. 5 35 30 12 32 22 27 18 25 16 11.2 Deap (con.t) • 刪除21,此時以最後一個節點22取代之,再將最後一個節點刪除,檢查左子樹仍為一棵min-heap,且節點鍵值22小於其對應節點32,不需作任何調整。刪除結果如下

  26. 5 35 30 27 32 22 18 25 16 11.2 Deap (con.t) • 刪除12,以最後一個節點27取代

  27. 5 35 30 16 32 22 18 25 27 11.2 Deap (con.t) • 左子樹不符合min-heap的定義,將27子節點中鍵值較小者16交換 • 最後16與其對應的30比較;16小於30,故不需再做調整

  28. 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的節點數,如下所示

  29. 0 1 2 3 11.3 Binomial heap (con.t) • Bk的高度為 k,如 B3 表示此棵Binomial tree的高度為3 • 在高度為i的那一層共有 k! / i!(k-i)! 個節點 高度

  30. 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,如下圖所示:

  31. 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由小至大排列之

  32. 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合併

  33. 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下方,如下圖所示:

  34. 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的合併

  35. 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)

  36. 11.3 Binomial heap (con.t) 11.3.2 加入的動作 • 將一節點加入到Binomial heap,有二個步驟: • 將它加入到head[H]指向Binomial tree之樹根的鏈結串列中 • 執行合併的動作。

  37. 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]指向的樹根串列中

  38. 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)

  39. 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如下 :

  40. 10 7 12 23 head[H] 8 13 15 16 17 11 19 28 11.3 Binomial heap (con.t) • 將最小的鍵值1刪除,則為

  41. 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,因此要執行合併的動作

  42. 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)

  43. 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如下所示:

  44. 11.4 Fibonacci heap (con.t) • 每一節點的資料結構如下:

  45. 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,如下圖所示

  46. 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)

  47. 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的節點

  48. min[H] 20 36 50 16 6 39 37 22 42 31 11.4 Fibonacci heap (con.t) • 刪除鍵值2的節點後,此時的F-heap為

  49. 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的合併動作相同,在此不再贅述 

  50. min[H] 36 6 16 20 39 50 22 42 37 31 11.4 Fibonacci heap (con.t) • 而刪除動作的Big-O為O( log n) 

More Related