堆積
此條目需要補充更多來源。 (2024年8月11日) |
堆積(Heap)是電腦科學中的一種特別的完全二元樹。若是滿足以下特性,即可稱為堆積:「給定堆積中任意節點P和C,若P是C的母節點,那麼P的值會小於等於(或大於等於)C的值」。若母節點的值恆小於等於子節點的值,此堆積稱為最小堆積(min heap);反之,若母節點的值恆大於等於子節點的值,此堆積稱為最大堆積(max heap)。在堆積中最頂端的那一個節點,稱作根節點(root node),根節點本身沒有父節點(parent node)。
「堆積」的各地常用名稱 | |
---|---|
中國大陸 | 堆 |
臺灣 | 堆積 |
堆積始於J. W. J. Williams在1964年發表的堆積排序(heap sort),當時他提出了二元堆積樹作為此演算法的資料結構。
性質
編輯堆積的實現通過構造二元堆積(binary heap),實為二元樹的一種;由於其應用的普遍性,當不加限定時,均指該資料結構的這種實現。這種資料結構具有以下性質。
- 任意節點小於(或大於)它的所有後裔,最小元(或最大元)在堆積的根上(堆積序性)。
- 堆積總是一棵完全樹。即除了最底層,其他層的節點都被元素填滿,且最底層儘可能地從左到右填入。
將根節點最大的堆積叫做最大堆積或大根堆積,根節點最小的堆積叫做最小堆積或小根堆積。
支援的基本操作
編輯操作 | 描述 | 時間複雜度 |
---|---|---|
build | 採用羅伯特·弗洛伊德提出的較快方式建立堆積 | |
insert | 向堆積中插入一個新元素 | |
update | 將新元素提升使其符合堆積的性質 | |
get | 取得當前堆積頂元素的值 | |
delete | 刪除堆積頂元素 | |
heapify | 使刪除堆積頂元素的堆積再次成為堆積 |
某些堆積實現還支援其他的一些操作,如斐波那契堆積支援檢查一個堆積中是否存在某個元素。
堆積的線上視覺化頁面提供了多種堆積操作的視覺化演示。可以通過介面上的切換按鈕在大根堆積和小根堆積之間自由切換,切換時系統會自動重新構建整個堆積結構。[1]
可以在輸入框中輸入數字並點擊"插入節點"按鈕,就能觀察新節點如何通過上浮(heapify up)操作找到其正確位置。
當點擊"刪除根節點"按鈕時,可以看到堆積頂元素被移除,以及最後一個節點如何通過下沉(heapify down)操作重建堆積的平衡。刪除的節點會在右側短暫顯示,隨後會消失。
此外,該頁面還提供了隨機初始化功能,可以快速生成一個包含10到50個亂數值的新堆積,方便進行各種測試和觀察。
範例代碼
編輯為將元素X插入堆積中,找到空閒位置,建立一個空穴,若滿足堆積序性(英文:heap order),則插入完成;否則將父節點元素裝入空穴,刪除該父節點元素,完成空穴上移。直至滿足堆積序性。這種策略叫做上濾(percolate up)。[2]
以上是插入到一個二元堆積的過程。
DeleteMin
,刪除最小元,即二元樹的根或父節點。刪除該節點元素後,佇列最後一個元素必須移動到堆積得某個位置,使得堆積仍然滿足堆積序性質。這種向下替換元素的過程叫作下濾。
應用
編輯堆積排序
編輯堆積(通常是二元堆積)常用於排序。這種演算法稱作堆積排序。
事件類比
編輯主要運用堆積的排序以選擇優先。
優先權佇列
編輯在佇列中,排程程式反覆提取佇列中第一個作業並執行,因為實際情況中某些時間較短的任務將等待很長時間才能結束,或者某些不短小,但具有重要性的作業,同樣應當具有優先權。堆積即為解決此類問題設計的最佳資料結構。[2]
戴克斯特拉演算法
編輯參考
編輯- ^ 堆積的線上視覺化頁面: 支援堆積操作的視覺化演示
- ^ 2.0 2.1 《資料結構與演算法分析》Mark Allen Weiss(美)第六章,優先佇列(堆積)。