最小堆積
最小堆(Min Heap)是一種特殊的堆(Heap)數據結構,它同時滿足堆的性質和二叉樹的性質。在最小堆中,根節點的值始終是最小的,並且每個節點的值都不會大於其父節點的值。這種數據結構可以用來實現優先佇列(Priority Queue),其中最小的元素會優先被取出。
最小堆可以通過以下方式來定義:
- 最小堆是一個完全二叉樹,其中每個節點的值都不會大於其父節點的值。
- 最小堆的根節點始終是最小的元素。
- 最小堆的結構可以通過調整(heapify)操作來維持,即使是在插入新元素或刪除根節點後。
最小堆的插入操作相對簡單,只需要將新元素作為新的根節點添加,然後通過調整操作將其餘部分重新組織成最小堆。刪除操作則稍微複雜一些,需要刪除根節點,並將最後一個節點移到根節點的位置,然後重新調整堆結構。
最小堆的應用包括但不限於:
- 優先佇列:最小堆可以用來實現優先佇列,其中優先級最高的元素會首先被取出。
- 排序:通過多次刪除最小元素並將其從堆中取出,可以將整個堆中的元素排序。
- 頂端排序(Topological Sorting):在圖論中,最小堆可以用來找出有向無環圖(DAG)中的一系列頂點,這些頂點沒有指向它們的邊。
最小堆的實現可以採用陣列或二叉樹來表示,其中陣列實現是最常見的,因為它簡單且高效。在陣列實現中,每個索引從0開始,並且可以使用parent(i)
、left(i)
和right(i)
函數來計算一個節點的父節點、左孩子和右孩子。
例如,一個大小為6的最小堆可能會像這樣表示:
0
/ \
1 2
\ \
3 4
\ /
5
在這個最小堆中,索引0的元素始終是最小的,並且每個節點的值都不會大於其父節點的值。