480 likes | 702 Views
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 節所 談的完整二元樹。.
E N D
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節所談的完整二元樹。
8.1 何謂堆積 • 它是一棵Heap,而不是二元搜尋樹。 • 在調整的過程中有二種方式,一是由上而下,從樹根開始與其子節點相比,若前者大則不用交換,反之,則要交換;以符合父節點大於子節點。
8.1 何謂堆積 • 此種方法也可以讓子節點先比,找出最大者再與其父節點比,此種方法至多只要做一次對調即可,如下圖23和30中30較大,因此15和30對調。 • 由於這種方式較快,故若以由上而下調整時,皆以此種方式進行之。
8.1 何謂堆積 • 一棵Heap不是唯一,因為只要父節點大於子節點即可。 • 需在此提醒讀者的是,當中間有某些節點互換時,需要再往上相比較,直到父節點大於子節點為止。
8.1 何謂堆積 • 第二種方法為由下而上,先算出此棵樹的節點數目,假設n,再取其,從此節點,開始與它的最大子節點相比,若最大子節點的鍵值大於父節點之鍵值,則相互對調,一直做到樹根止。 • 記得相互對調後要往下繼續比較,看看是否還要對調喔!
8.1 何謂堆積 • 調整的方法如下: • step 1:先將每一節點按完整二元樹的順序加以編號如下圖:
8.1 何謂堆積 • step 2: ,故從第2節點開始與其較大的子節點相比。由於40比23大,故調換之。
8.1 何謂堆積 • step 3:接下來將第1個節點與其較大子 節點比,我們發現40大於15,故調換之,如下圖:
8.1 何謂堆積 • step 4:雖然皆已調換完成,但我們發現第2節點小於第4節點(15<23),故需繼續對調,如下圖:
8.1 何謂堆積 8.1.1 Heap的加入 • 承以上的那一棵Heap,加入30及50。 • 首先按照完整二元樹的特性將30加進來,如下圖
8.1 何謂堆積 • 因為加入50後不是一棵Heap,所以要加以調整之。 • 由於原先已是一棵Heap,所以,只要將加入的那一個節點往上調整即可。
8.1 何謂堆積 8.1.2 Heap的刪除 • Heap的刪除則將完整二元樹的最後一節點取代被刪除的節點,然後判斷是否為一棵Heap,若否,則再依上述的方法加以調整之。
8.1 何謂堆積 • 再刪除40 ,則將10取代之。
8.1 何謂堆積 • 再舉一例,有一棵Heap如下:
8.1 何謂堆積 • 今欲將40刪除,則以15取代40(因為15在完整二元樹中是最後一個節點)
8.1 何謂堆積 • 此時將15和其所屬的最大子節點比較,亦即15和35(因為它大於30)比較,直接將15和35交換。
8.2 何謂min-heap • 上述介紹的Heap,我們稱之為max-heap,在max-heap樹中的鍵值,一律是上大於下,節點內的鍵值一律大於其子節點。其中min-heap的觀念十分簡單,其節點鍵值一律小於子節點,恰與max-heap相反,如下圖即為一棵min-heap的例子。
8.2 何謂min-heap • 由於其加入與刪除的方法與max-heap十分類似,在此就不重覆說明了。
8.3 min-max heap • min-max heap包含了min-heap與max-heap兩種Heap的特徵。
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的特性。
8.3 min-max heap 8.3.1 min-max heap的加入 • min-max heap的加入與max-heap的原理差不多,但是加入後,要調整至符合上述min-max heap的定義。
8.3 min-max heap • 若加入5,步驟如下:
8.3 min-max heap • 加入後18>5,不符合第一項定義,將5與18交換。
8.3 min-max heap • 交換後,由於10>5,不符合第二項定義,將5與10對調。 • 此時已符合min-max heap的定義,不須再作調整。
8.3 min-max heap 8.3.2 min-max heap的刪除 • 若刪除min-max heap的最後一個節點,則直接刪除即可;否則,先將刪除節點鍵值與樹中的最後一個節點對調,再作調整動作,亦即以最後一個節點取代被刪除節點。假設已存在一棵min-max heap如下:
8.3 min-max heap • 若刪除45,則直接刪除。
8.3 min-max heap • 若刪除40,則需以最後一個節點的鍵值18取代40。
8.3 min-max heap • 交換後18<19,不符合第一項定義,將18與19交換。
8.3 min-max heap • 交換後,由於19小於32、28、34、31,不符合第三項定義,必需將19與最大的鍵值34交換。 • 符合min-max heap的定義,刪除動作結束。
8.4 Deap • 何謂Deap:Deap同樣也具備max-heap與min-heap的特徵,其定義如下: • Deap的樹根不儲存任何資料,為一空節點。 • 樹根的左子樹,為一棵min-heap;右子樹則為max-heap。 • min-heap與max-heap存在一對應,假設左子樹中有一節點為i,則在右子樹中必存在一節點j與i對應,則i必須小於等於j。
8.4 Deap 8.4.1 Deap 的加入 • Deap的加入動作與其它Heap一樣,將新的鍵值加入於整棵樹的最後,再調整符合Deap的定義,假設已存在一deap如右:
8.4 Deap • 若加入25,加入後右子樹仍為一棵max-heap,且左子樹對應節點15小於等於它所對應的右子樹節點25,符合deap的定義,加入的結果如下:
8.4 Deap • 加入17,加入後的圖形如下所示:
8.4 Deap • 此時右子樹仍為max-heap,但17小於其左子樹的對應節點20,故將17與20交換。
8.4 Deap • 加入40,如下所示:
8.4 Deap • 加入後左子樹雖為min-heap,但40大於其對應節點25(與節點40的父節點對應之右子樹節點),不符合deap的定義,故將40與25交換,如下所示:
8.4 Deap • 交換後樹中的右子樹不是一棵max-heap,重新將其調整為max-heap即可。
8.4 Deap 8.4.2 Deap的刪除 • Deap的刪除動作與其它Heap一樣,當遇到刪除節點非最後一個節點時,要以最後一個節點的鍵值取代刪除節點,並調整至符合deap的定義,假設存在-Deap如下:
8.4 Deap • 若刪除29,則直接刪除即可,結果如下圖所示:
8.4 Deap • 刪除21,此時以最後一個節點22取代之,再將最後一個節點刪除,檢查左子樹仍為一棵min-heap,且節點鍵值22小於其對應節點32,不需作任何調整。刪除結果如右:
8.4 Deap • 刪除12,以最後一個節點27取代。
8.4 Deap • 左子樹不符合min-heap的定義,將27子節點中鍵值較小者16交換。
8.4 Deap • 最後16與其對應的30比較;16小於30,並且27也小於它所對應max-heap那邊的30,故不需再做調整。