670 likes | 1.2k Views
堆積 (Heap Tree). 授課老師:蕭志明. 何謂堆積. 堆積 (Heap) 和二元搜尋樹大致上雷同,但有一點點差異。 Heap 在分類上大致可分為 Max-heap, Min-heap, Min-max heap 及 Deap 。 Heap 也可用在排序上,此稱為 Heap sort (堆積排序)。. Definition. 最大樹 ( max tree ) 是一種樹,其中每一個節點的值不小於它的子節點 ( 如果存在的話 ) 的鍵值。 最大累堆 ( max heap ) 為一種也是最大樹的完整二元樹。
E N D
堆積(Heap Tree) 授課老師:蕭志明
何謂堆積 • 堆積(Heap)和二元搜尋樹大致上雷同,但有一點點差異。 • Heap在分類上大致可分為Max-heap, Min-heap, Min-max heap及Deap。 • Heap也可用在排序上,此稱為Heap sort(堆積排序)。
Definition • 最大樹 ( max tree ) 是一種樹,其中每一個節點的值不小於它的子節點 ( 如果存在的話 ) 的鍵值。 • 最大累堆 ( max heap ) 為一種也是最大樹的完整二元樹。 • 最小樹 ( min tree ) 是一種樹,其中每一個節點的值不大於它的子節點 ( 如果存在的話 ) 的鍵值。 最小累堆 ( min heap ) 為一種也是最小樹的完整二元樹。
何謂堆積 它是一棵Heap,而不是二元搜尋樹。在調整的過程中有二種方式: • 一是由上而下,從樹根開始與其子節點相比,若前者大則不用交換 • ,反之,則要交換;以符合父節點大於子節點。
堆積操作 此種方法也可以讓子節點先比,找出最大者再與其父節點比,此種方法至多只要做一次對調即可,如下圖23和30中30較大,因此15和30對調。由於這種方式較快,故若以由上而下調整時,皆以此種方式進行之。
何謂堆積 一棵Heap不是唯一,因為只要父節點大於子節點即可。需在此提醒讀者的是,當中間有某些節點互換時,需要再往上相比較,直到父節點大於子節點為止。
基本的堆積樹演算法 • 堆積樹有二個基本的維護作業: • 新增。 • 刪除。 • 對堆積樹進行追蹤、搜尋與列印,是沒有意義的。 • 在這一方面,它比較像是一個限制資料結構。 • Heap也可用在排序上,此稱為Heap sort(堆積排序)。
基本的堆積樹演算法 為了實作新增與刪除作業,需要二個基本的演算法: • 重新向上堆積 • 重新向下堆積。
重新向上堆積 (ReheapUp) • 假設一個類完全二元樹包含N個節點,其中N-1個節點滿足堆積樹的順序性質,但是最後一個節點不滿足。 • 換句話說,倘使最後一個節點不存在,則此結構即成為一個堆積樹。 • 重新向上堆積 (ReheapUp),將最後一個節點往上移動,直到它位於正確的位置,以符合堆積的定義。 • 圖9-4顯示調整的情況,在進行重新向上堆積樹之前,最後一個節點的順序不對。而在操作之後,它會位於正確的位置,因此堆積樹也就多了一個節點。
重新向上堆積 (ReheapUp) • 新增在葉節點進行。 • 堆積樹是一個完全或類完全樹,新節點必須放在葉階層的第1個(最左邊)空位,如圖9-4所示。 • 如果新節點的鍵值大於父節點,就交換兩者的資料與鍵值,將新節點往上移動。 • 經由不斷地改變子-父節點的鍵值與資料,新節點最後會到達正確的位置。 • 重新向上堆積 (ReheapUp) 藉由將最後一個節點向上移動,直到它位於正確的位置,以修復堆積樹的結構。
重新向上堆積 (ReheapUp) • 圖9-5追蹤ReheapUp操作。 • 依定義25比父節點12的左子樹的所有鍵值都大。於是將25與12交換。 • 接著發現25依然大於其父節點21,所以再交換一次。 • 最後目標節點鍵值25小於父節點鍵值42,表示找到正確的位置,整個操作結束。
重新向下堆積 (ReheapDown) 重新向下堆積 (ReheapDown) • 假設一個類完全二元樹,除了根節點之外,滿足堆積樹的順序性質。 • 這會發生在刪除根節點時,剩下兩個堆積樹。 • 為了修正這種情況,將最後一個節點資料移到根節點。很明顯地,這會破壞堆積樹的性質。 • 重新向下堆積 (ReheapDown) 由根節點向下移動,一直找到它正確的位置為止。 • 為了修復結構,需要將根節點向下移動,直到它的位置符合堆積樹的順序規定。 • 們稱此作業為重新向下堆積(ReHeapDown),如圖9-6所示。
重新向下堆積 (ReheapDown) • 圖9-7顯示重新向下堆積的作業過程。 • 開始時,根節點10小於其子樹,所以要檢查左右子樹,並選擇比較大的子樹32,與根節點作 交換。 • 圖9-7(b) 顯示交換之後的情況,繼續檢查子樹以判斷是否可以結束作業,發現10小於其子樹,所以要將10與比較大的子樹30作交換。 • 此時,已到達葉節點,所以可以結束作業。
Heap的加入 加入30及50。 首先按照完整二元樹的特性將30加進來, 如下圖
Heap的加入 • 因為加入50後不是一棵Heap,所以要加以調整之。 • 由於原先已是一棵Heap,所以,只要將加入的那一個節點往上調整即可。
Heap的刪除 Heap的刪除則將完整二元樹的最後一節點取代被刪除的節點,然後判斷是否為一棵Heap,若否,則再依上述的方法加以調整之。
Heap的刪除 再刪除40,則將10取代之。
堆積練習 再舉一例,有一棵Heap如下:
堆積練習 今欲將40刪除,則以15取代40(因為15在完整二元樹中是最後一個節點)
堆積練習 此時將15和其所屬的最大子節點比較,亦即15和35(因為它大於30)比較,直接將15和35交換。
何謂min-heap 上述介紹的Heap,我們稱之為max-heap,在max-heap樹中的鍵值,一律是上大於下,節點內的鍵值一律大於其子節點。其中min-heap的觀念十分簡單,其節點鍵值一律小於子節點,恰與max-heap相反,如下圖即為一棵min-heap的例子。
何謂min-heap 由於其加入與刪除的方法與max-heap十分類似,在此就不重覆說明了。
min-max heap min-max heap包含了min-heap與max-heap兩種Heap的特徵
min-max heap • 何謂min-max heap: • 為了方便解說,我們就直接以上圖為例,來定義min-max heap,必須符合下列三項定義: 1.min-max heap是以一層min-heap,一層max-heap交互構成的。 2.樹中為min-heap的部分,仍需符合min-heap的特性。 3.樹中為max-heap的部分,仍需符合 max-heap的特性。
min-max heap的加入 min-max heap的加入與max-heap的原理差不多,但是加入後,要調整至符合上述min-max heap的定義。
min-max heap的加入 • 若加入5,步驟如下:
min-max heap的加入 • 加入後18>5,不符合第一項定義,將5與18交換。
min-max heap的加入 • 交換後,由於10>5,不符合第二項定義,將5與10對調。 此時已符合min-max heap的定義,不須再作調整。
min-max heap的刪除 • 若刪除min-max heap的最後一個節點,則直接刪除即可;否則,先將刪除節點鍵值與樹中的最後一個節點對調,再作調整動作,亦即以最後一個節點取代被刪除節點。假設已存在一棵min-max heap如下:
min-max heap的刪除 • 若刪除45,則直接刪除。
min-max heap的刪除 • 若刪除40,則需以最後一個節點的鍵值18取代40。
min-max heap的刪除 • 交換後18<19,不符合第一項定義,將18與19交換。
min-max heap的刪除 • 交換後,由於19小於32、28、34、31,不符合第三項定義,必需將19與最大的鍵值34交換。 符合min-max heap的定義,刪除動作結束。
Deap • Deap同樣也具備max-heap與min-heap的特徵,其定義如下: 1.Deap的樹根不儲存任何資料,為一空節點。 2.樹根的左子樹,為一棵min-heap;右子樹則為max-heap。 3.min-heap與max-heap存在一對應,假設左子樹中有一節點為i,則在右子樹中必存在一節點j與i對應,則i必須小於等於j。