最小堆
最小堆(Min Heap)是一種特殊的完全二叉樹,也稱為小頂堆,是堆的一種類型。堆通常被用來解決優先佇列的問題,其中最小堆總是保持最頂部的元素(根節點)是最小的。
最小堆的一些關鍵特性:
- 堆頂(根節點)總是最小值。
- 堆中的每個節點都不大於(或者小於)其父節點。
- 最小堆是經過排序的,即堆中的每個子樹都是最小堆。
- 最小堆的形狀是「斜向下的」,這意味著從根節點到葉子節點的路徑上,每個節點的值都小於(或者等於)其父節點的值。
最小堆的插入和刪除操作的時間複雜度都是O(log n),其中n是堆中元素的數量。這是因為堆的內部結構是平衡的,所以對堆的任何操作都可以在log n的時間內完成。
最小堆的實現通常使用數組來實現,因為這樣可以在O(1)時間內訪問任一節點,並且可以通過交換數組中的元素來調整堆的形狀。
下面是一個簡單的最小堆的Python實現:
class MinHeap:
def __init__(self):
self.heap = []
def insert(self, item):
self.heap.append(item)
self.bubble_up(len(self.heap) - 1)
def bubble_up(self, i):
while i // 2 > 0 and self.heap[i] < self.heap[i // 2]:
self.heap[i], self.heap[i // 2] = self.heap[i // 2], self.heap[i]
i = i // 2
def extract_min(self):
if not self.heap:
return None
min_val = self.heap[0]
self.heap[0] = self.heap.pop()
self.sink_down(0)
return min_val
def sink_down(self, i):
while 2 * i < len(self.heap):
child = 2 * i
if child + 1 < len(self.heap) and self.heap[child + 1] < self.heap[child]:
child += 1
if self.heap[i] <= self.heap[child]:
break
self.heap[i], self.heap[child] = self.heap[child], self.heap[i]
i = child
def __len__(self):
return len(self.heap)
def __str__(self):
return str(self.heap)
# 測試代碼
heap = MinHeap()
heap.insert(10)
heap.insert(3)
heap.insert(5)
heap.insert(7)
print(heap)
print(heap.extract_min())
print(heap)
這段代碼定義了一個最小堆類,並提供了插入、刪除最小值、獲取堆的大小和列印堆的方法。測試代碼中,我們創建了一個最小堆,並插入了一些元素,然後提取了最小值,並列印了堆的狀態。