完全二叉堆

2021-10-05 00:25:25 字數 1573 閱讀 5601

堆(heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵完全二叉樹的陣列物件。由此可見,堆是樹與向量的結合體,其邏輯結構等同於完全二叉樹,而物理結構與向量相同。

二叉堆具有結構性和堆序性,所謂結構性即其邏輯結構等同於完全二叉樹,而堆序性則是堆中任一節點都與其父節點有固定的大小關係。

二叉堆可分為大頂堆和小頂堆,大頂堆的父結點的鍵值總是大於或等於任何乙個子節點的鍵值;小頂堆父結點的鍵值總是小於或等於任何乙個子節點的鍵值。

將新詞條插入向量末尾,新詞條的引入並未破壞堆的結構性,但有可能破壞了堆序性,需要進行上濾操作恢復堆序性,即將新詞條與父節點詞條交換位置,重複此操作直至堆序性恢復。

(a)乙個完全二叉堆

(b)插入新詞條5至末尾,不滿足堆序性,5上濾

(c)不滿足堆序性,5上濾

(d)滿足堆序性,插入完成

插入向量末尾消耗時間o(1),插入操作的主要時間消耗為上濾操作,上濾至多進行logn次,所以插入操作可以o(logn)時間內完成。

二叉堆的運用就是獲取堆頂詞條,所以待刪除詞條總是位於堆頂。呼叫向量介面刪除堆頂後,堆的結構性將被破壞。為修復這一缺陷,將最末尾的詞條轉移至堆頂。此時堆的結構性恢復,但堆序性遭到破壞。

由於新堆頂不滿足堆序性,進行下濾操作,即將新詞條與兩個孩子中的最大者交換位置,重複此操作直至恢復堆序性。

(a)乙個完全二叉堆

(b)刪除最大值5,並將末尾詞條1轉至堆頂

(c)不滿足堆序性,詞條1下溢

(d)不滿足堆序性,詞條1下溢

刪除與插入類似,下溢操作至多進行logn次,所以時間複雜度為o(logn)

反覆呼叫插入介面,即可將輸入詞條逐一插入其中,並最終完成建堆任務。但該方法的效率過低,若有n個詞條,則共需迭代n次,第k輪迭代耗時o(logk),故累計耗時為:

o(log1 + log2 + … + logn) = o(logn!) = o(nlogn)

在高效排序演算法的幫助下,本可以o(nlogn)時間內完成一次全排序,而在這裡花費同樣多時間所生產的堆卻只能提供乙個偏序。這一事實在某種程度上也暗示著,或許存在某種更快的建堆演算法。

可以將暴力法理解為自下而上的上濾,而floyd則是從下而上的下濾。只需自下而上地遍歷所有內部節點,並對每個內部節點分別呼叫一次下濾演算法。

該演算法依然需做n步迭代,以對所有節點各做一次下濾。這裡,每個節點的下濾所需的時間線性正比於其高度,故總體執行時間取決於各點的高度總和:

σhi=0( (d-i)·2i ) = 2d+1 - (d+2) = n - log2(n+1) = o(n)

由於在遍歷所有詞條之前,絕不可能確定堆的結構,故以上已是建堆操作的最優演算法。

該文內容均來自鄧俊輝老師的《資料結構與演算法》

二叉堆(完全二叉樹)

最小堆的實現 最小堆是一顆完全二叉樹 這裡用陣列實現完全二叉樹 index 0 1 2 3 4 5 6 value 空 a b c d 任意index,其父親為index 2,左兒子為2 index,右兒子為2 index 1 時間複雜度 o logn include includeusing na...

二叉堆 完全二叉樹 優先佇列

完全二叉樹的邏輯結構是樹結構,但由於其特殊性,資料結構中常用陣列來儲存.訪問父節點,左子結點,右子節點都很方便 陣列儲存以1為起點 假設有某一結點u a u 2 為其父節點,當且僅當u 1 a u 2 為其左子結點,當且僅當u 2 n a u 2 1 為其右子節點,當且僅當u 2 1 n inclu...

資料結構 二叉完全樹(堆)

參考文章 堆常用來實現優先佇列。用陣列儲存資料,而不是鍊錶。在佇列中,作業系統排程程式反覆提取佇列中第乙個作業並執行,因為實際情況中某些時間較短的任務將等待很長時間才能結束,或者某些不短小,但具有重要性的作業,同樣應當具有優先權。堆即為解決此類問題設計的一種資料結構。堆的實現通過構造二叉堆 bina...