1 / 47

Chapter 8 堆積

Chapter 8 堆積. 8.1 何謂堆積 8.2 何謂 min-heap 8.3 min-maxheap 8.4 Deap. 堆積 堆積 (Heap) 和二元搜尋樹大致上雷同,但有一點點差異。 Heap 在分類上大致可分為 Max-heap, Min-heap, Min-max heap 及 Deap 。 Heap 也可用在排序上,此稱為 Heap sort (堆積排序)。. 8.1 何謂堆積. 何謂堆積( Heap )? 定義如下: 堆積是一棵二元 樹,其樹根的鍵 值大於子樹的鍵 值,而且必須符 合第六章 6.2 節所 談的完整二元樹。.

cliff
Download Presentation

Chapter 8 堆積

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. Chapter 8 堆積 8.1 何謂堆積 8.2 何謂min-heap 8.3 min-maxheap 8.4 Deap

  2. 堆積 • 堆積(Heap)和二元搜尋樹大致上雷同,但有一點點差異。 • Heap在分類上大致可分為Max-heap, Min-heap, Min-max heap及Deap。 • Heap也可用在排序上,此稱為Heap sort(堆積排序)。

  3. 8.1 何謂堆積 • 何謂堆積(Heap)? • 定義如下:堆積是一棵二元樹,其樹根的鍵值大於子樹的鍵值,而且必須符合第六章6.2節所談的完整二元樹。

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

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

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

  7. 8.1 何謂堆積 • 第二種方法為由下而上,先算出此棵樹的節點數目,假設n,再取其,從此節點,開始與它的最大子節點相比,若最大子節點的鍵值大於父節點之鍵值,則相互對調,一直做到樹根止。 • 記得相互對調後要往下繼續比較,看看是否還要對調喔!

  8. 8.1 何謂堆積 • 調整的方法如下: • step 1:先將每一節點按完整二元樹的順序加以編號如下圖:

  9. 8.1 何謂堆積 • step 2: ,故從第2節點開始與其較大的子節點相比。由於40比23大,故調換之。

  10. 8.1 何謂堆積 • step 3:接下來將第1個節點與其較大子 節點比,我們發現40大於15,故調換之,如下圖:

  11. 8.1 何謂堆積 • step 4:雖然皆已調換完成,但我們發現第2節點小於第4節點(15<23),故需繼續對調,如下圖:

  12. 8.1 何謂堆積 8.1.1 Heap的加入 • 承以上的那一棵Heap,加入30及50。 • 首先按照完整二元樹的特性將30加進來,如下圖

  13. 8.1 何謂堆積

  14. 8.1 何謂堆積 • 因為加入50後不是一棵Heap,所以要加以調整之。 • 由於原先已是一棵Heap,所以,只要將加入的那一個節點往上調整即可。

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

  16. 8.1 何謂堆積 • 再刪除40 ,則將10取代之。

  17. 8.1 何謂堆積 • 再舉一例,有一棵Heap如下:

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

  19. 8.1 何謂堆積 • 此時將15和其所屬的最大子節點比較,亦即15和35(因為它大於30)比較,直接將15和35交換。

  20. 8.2 何謂min-heap • 上述介紹的Heap,我們稱之為max-heap,在max-heap樹中的鍵值,一律是上大於下,節點內的鍵值一律大於其子節點。其中min-heap的觀念十分簡單,其節點鍵值一律小於子節點,恰與max-heap相反,如下圖即為一棵min-heap的例子。

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

  22. 8.3 min-max heap • min-max heap包含了min-heap與max-heap兩種Heap的特徵。

  23. 8.3 min-max heap • 何謂min-max heap:為了方便解說,我們就直接以上圖為例,來定義min-max heap,必須符合下列三項定義: • min-max heap是以一層min-heap,一層max-heap交互構成的。 • 樹中為min-heap的部分,仍需符合min-heap的特性。 • 樹中為max-heap的部分,仍需符合max-heap的特性。

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

  25. 8.3 min-max heap • 若加入5,步驟如下:

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

  27. 8.3 min-max heap • 交換後,由於10>5,不符合第二項定義,將5與10對調。 • 此時已符合min-max heap的定義,不須再作調整。

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

  29. 8.3 min-max heap

  30. 8.3 min-max heap • 若刪除45,則直接刪除。

  31. 8.3 min-max heap • 若刪除40,則需以最後一個節點的鍵值18取代40。

  32. 8.3 min-max heap • 交換後18<19,不符合第一項定義,將18與19交換。

  33. 8.3 min-max heap • 交換後,由於19小於32、28、34、31,不符合第三項定義,必需將19與最大的鍵值34交換。 • 符合min-max heap的定義,刪除動作結束。

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

  35. 8.4 Deap 8.4.1 Deap 的加入 • Deap的加入動作與其它Heap一樣,將新的鍵值加入於整棵樹的最後,再調整符合Deap的定義,假設已存在一deap如右:

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

  37. 8.4 Deap • 加入17,加入後的圖形如下所示:

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

  39. 8.4 Deap • 加入40,如下所示:

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

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

  42. 8.4 Deap 8.4.2 Deap的刪除 • Deap的刪除動作與其它Heap一樣,當遇到刪除節點非最後一個節點時,要以最後一個節點的鍵值取代刪除節點,並調整至符合deap的定義,假設存在-Deap如下:

  43. 8.4 Deap • 若刪除29,則直接刪除即可,結果如下圖所示:

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

  45. 8.4 Deap • 刪除12,以最後一個節點27取代。

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

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

More Related