Heap
Heap
是一種特殊的「完全二元樹 (Complete Binary Tree)」結構,滿足 Heap 性質。他被常用來實作「優先佇列 (Priority Queue)」。
一、基本術語
名稱
說明
Heap
一個完全二元樹,滿足 Heap 性質
Max Heap
每個節點都大於或等於其子節點 (根為最大值)
Min Heap
每個節點都小於或等於其子節點 (根為最小值)
Heapify
將任意數組轉成 Heap 的運算過程
Priority Queue
基於 Heap 實作,能快速取出最大或最小值的組織
二、Heap 特性
完全二元樹:從左到右填滿,無間隙
親子節點關係:
如果節點給定 index
i
(以 0 為基):左子節點:
2i + 1
右子節點:
2i + 2
父節點:
(i - 1) // 2
時間複雜度:
插入 / 刪除:
O(log n)
取最大 / 最小值:
O(1)
三、Heap 操作 (Python 範例)
1. 插入元素 (Insert)
def heap_push(heap, value):
heap.append(value)
i = len(heap) - 1
while i > 0:
parent = (i - 1) // 2
if heap[i] > heap[parent]: # Max Heap
heap[i], heap[parent] = heap[parent], heap[i]
i = parent
else:
break
2. 移除最大值 (Pop)
def heap_pop(heap):
if not heap:
return None
heap[0], heap[-1] = heap[-1], heap[0]
max_val = heap.pop()
i = 0
while 2 * i + 1 < len(heap):
left = 2 * i + 1
right = 2 * i + 2
max_child = left
if right < len(heap) and heap[right] > heap[left]:
max_child = right
if heap[i] < heap[max_child]:
heap[i], heap[max_child] = heap[max_child], heap[i]
i = max_child
else:
break
return max_val
四、Python 常用的 Heap 模組:heapq
heapq
Python 自來的 heapq
模組對應最小堆 (Min Heap),如需 Max Heap 可對值加負號處理
import heapq
nums = [3, 1, 5, 7, 2]
heapq.heapify(nums) # 轉成 Min Heap
heapq.heappush(nums, 0)
print(heapq.heappop(nums)) # 最小值 0
五、Heap 應用
優先队列 (Priority Queue)
Top-K 問題 (Ex: 找出前 K 大或前 K 小值)
Dijkstra 最短路算法
Huffman Encoding
六、Heap vs BST (Binary Search Tree)
特性
Heap
Binary Search Tree
結構限制
完全二元樹
無限制
排序性質
只滿足根節點性質
全基於排序的結構
操作性能
快速取最大/最小
快速搜尋/插入/刪除
時間複雜度
插入/刪除 O(log n)
平均 O(log n),最壞 O(n)
Heap 是一個很有效率的組織,重要在於需要持續操作 "取出最大/最小值"的場景,是優先队列與許多應用算法的核心基礎。
Last updated