分治演算法 (Divide & Conquer)
Published: Sun Feb 22 2026 | Modified: Sat Feb 07 2026 , 2 minutes reading.
分治演算法:委派的藝術
演算法背後的故事:羅馬帝國
羅馬人是如何統治半個世界的?她們並不一次性挑戰所有人。她們使用 Divide et Impera(分而治之)的策略。
- 如果一個蠻族部落太龐大,就挑撥她們內部發生內戰。
- 分別處理分裂後的小派系。
- 將征服的土地合併進同一個帝國。
在演算法中,分治法 (Divide and Conquer) 遵循同樣的邏輯。規模為 100 萬的問題令人望而生畏,但規模為 1 的問題卻微不足道。透過不斷將問題對半切開,我們抵達了微不足道的基準狀態,然後以此為基礎重新構建出龐大的「帝國」。
為什麼需要它?
- 高效排序: 歸併排序 (MergeSort) 和 快速排序 (QuickSort) ()。
- 大數運算: 將兩個 1000 位的數字相乘(Karatsuba 演算法)。
- 並行計算: 由於子問題是獨立的,妳可以將她們分配給不同的 CPU 核心同時計算。
- 二分搜尋: 分治法最形式的形式——每一步都將搜尋空間切掉一半。
演算法是如何「思考」的
分治策略包含三個明確的步驟:
- 分 (Divide): 將問題分解為規模更小、但類型相同的子問題。
- 治 (Conquer): 遞迴地解決子問題。如果子問題足夠小(基礎情況),則直接求解。
- 合 (Combine): 將子問題的答案縫合在一起,形成最終解決方案。
與 DP 的區別: 在分治法中,子問題是不重疊的。妳不需要兩次解決同一件事(不像斐波那契數列)。妳是在解決一個整體中互不干擾的不同部分。
工程決策:MapReduce
現代互聯網(Google, Facebook)的宏大規模依賴於分治法。
- Map: 分割海量數據集(PB 級別),發送到 1 萬台伺服器上進行處理(治)。
- Reduce: 收集這 1 萬台伺服器的結果,並合併成一份最終報表(合)。
實作參考 (Python)
# 使用分治法尋找列表中的最大元素
def find_max(arr):
# 1. 基礎情況:極小的問題
if len(arr) == 1:
return arr[0]
# 2. 分 (Divide)
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
# 3. 治 (Conquer - 遞迴)
max_left = find_max(left_half)
max_right = find_max(right_half)
# 4. 合 (Combine)
return max(max_left, max_right)
# 使用範例
data = [3, 1, 9, 4, 5, 8, 2]
print(f"最大值: {find_max(data)}")小結
分治法教會我們:只要妳能切得足夠細,就沒有什麼問題是解決不了的。 透過將世界分解為可管理的小塊,我們獲得了處理海量數據的能力,而這些數據原本足以壓垮任何單一的心智(或 CPU)。它提醒我們,領導力就是委派複雜性的藝術。
