200 likes | 461 Views
Chapter 8 堆積. 何謂堆積. 何謂堆積 (Heap) ? 堆積是一棵二元樹,其樹根的鍵值大於子樹的鍵值, 必須符合完整二元樹的定義 不管左子樹和右子樹的大小順序 ( 與二元搜尋樹最大的差異處 ). 何謂堆積. 堆積 (Heap) 和 二元搜尋樹 大致上雷同,但有一點點差異。 Heap 在分類上大致可分為 Max-heap, Min-heap, Min-max heap 及 Deap 。 Heap 可用在排序上,此稱為 Heap sort (堆積排序)。 一棵 Max-Heap 不是唯一,因為只要父節點大於子節點即可。. 堆積的建立.
E N D
何謂堆積 • 何謂堆積(Heap)? • 堆積是一棵二元樹,其樹根的鍵值大於子樹的鍵值, • 必須符合完整二元樹的定義 • 不管左子樹和右子樹的大小順序(與二元搜尋樹最大的差異處)
何謂堆積 • 堆積(Heap)和二元搜尋樹大致上雷同,但有一點點差異。 • Heap在分類上大致可分為Max-heap, Min-heap, Min-max heap及Deap。 • Heap可用在排序上,此稱為Heap sort(堆積排序)。 • 一棵Max-Heap不是唯一,因為只要父節點大於子節點即可。
堆積的建立 • 堆積可以用於排序上,簡稱 Heap Sort。 • 堆積排序的步驟: • 先將資料利用完整二元樹的方式將其建立起來 • 將建立完成的完整二元樹「調整」成 Heap • 以堆疊(由大到小)或佇列(由小到大)的方式輸出
堆積的建立 • 堆積的調整方式 • 由上而下,從樹根開始分別與其子節點相比,若前者大則不用交換,反之,則要交換;以符合父節點大於子節點 1 1 1 30 23 15 換 換 3 2 3 2 3 2 15 23 23 15 30 30
堆積的調整 • (一) 為由下而上: • 先算出此棵樹的節點數目,假設n,再取其 n/2 ,從此節點,開始與它的最大子節點相比,若最大子節點的鍵值大於父節點之鍵值,則相互對調,一直做到樹根止。應注意的是,若相互對調後要往下繼續比較,調整的方法如下:
堆積的調整 • step 1:先將每一節點按完整二元樹的順序加以編號如下圖: 1 15 2 3 23 20 5 6 4 40 8 10
堆積的調整 • step 2: 6/2 ,故從第3節點開始與其較大的子節點相比。由於20比10大,故調換之。 1 15 2 3 23 10 20 5 6 4 40 8 20 10
堆積的調整 • step 3:接下來將第2個節點與其較大子節點比,我們發現40大於23,故調換之,如下圖: 1 15 2 3 23 40 20 5 6 4 40 8 10 23
堆積的調整 • step 4:接下來將第1個節點與其較大子節點比,我們發現40大於15,故調換之,如下圖: 1 15 40 2 3 40 20 15 5 6 4 8 23 10
堆積的調整 • step 5:雖然皆已調換完成,但因為第2節點小於第4節點(15<23),故需繼續對調,如下圖: 40 40 2 3 2 3 15 20 23 20 5 6 5 6 4 4 8 8 23 10 15 10
堆積的加入 • 先按照建立一棵完整二元樹的特性將資料加入 • 判斷加入後的二元樹是否為一棵堆積樹,若符合則完成加入;若否,則再加以調整之。 • 假設有一棵Heap,加入30及50。 • 首先按照完整二元樹的特性將30加進來,如下圖:
40 23 30 15 8 10 堆積的加入 40 23 10 15 8 30
50 23 40 15 8 10 30 堆積的加入 40 23 30 50 15 8 10 50 30
堆積的刪除 • Heap的刪除則將完整二元樹的最後一節點取代被刪除的節點,然後判斷是否為一棵Heap,若否,則再依上述的方法加以調整之。 40 40 刪除30 30 10 20 20 15 10 15 調整
堆積的刪除 40 10 刪除40 調整 15 15 20 20 10 20 15 10
何謂min-heap • 上述介紹的Heap,稱之為max-heap, • 在max-heap樹中的鍵值,一律是上大於下,節點內的鍵值一律大於其子節點。 • 而min-heap,其節點鍵值一律小於子節點,恰與max-heap相反。 • 加入與刪除的方法與max-heap十分類似。
Deap • Deap同樣也具備了Max-heap與Min-heap的特徵,其定義如下: • Deap的樹根不存任何資料,為一個空節點。 • 樹根的左子樹為一棵Min-heap;右子樹為Max-heap。 • Max-heap與Min-heap存在一對應,假設左子樹中有一節點i,則在右子樹中相同的位置存在一節點j與i對應,且i必須小於等於j。如下圖。
Deap 5 35 21 32 12 30 18 16 25 27 22 29
Deap的加入與刪除 • 加入與刪除的動作與堆積樹一樣。 • 將新的鍵值加入於整顆樹的最後,再調整至符合堆積樹的定義。 • 刪除時,當遇到刪除節點非最後一個節點時,要以最後一個節點的鍵值取代節點。