算法導論 第4章 分治策略(1)
分治策略 的三個步驟:
- 分解爲若干子問題,子問題形式與原問題相同,但規模更小
- 遞歸地解決子問題,若子問題規模足夠小則停止遞歸,直接求解
- 合併爲原問題的解式
足夠大需要遞歸求解的子問題稱爲 遞歸情況,不再需要遞歸的足夠小的子問題稱爲 基本情況。
求解遞歸式,即得到算法的Θ或O漸近界的方法的方法:
- 代入法:猜測一個界,用數學歸納法證明
- 遞歸樹法:將遞歸式轉換爲一棵樹,節點表示遞歸調用產生的代價,然後用邊界和技術來求解
- 主方法:用於解形如
的遞歸式
最大子數組問題
考慮購買股票的問題,希望在股票價格變化值的序列中找到最優購買和出售時機。
若使用暴力求解的方法,嘗試每對可能的購買和出售時間組合,則運行時間爲Ω(n2)。
將數據轉變爲每日價格相對於前一天的價格差,則問題轉化爲尋找數組A的和最大的非空連續子數組,即 最大子數組:
使用分治策略求解該問題,假設數組範圍爲A[low…high],中央位置mid,則最大子數組必然位於三種情況之一:
- 完全處於子數組A[low…mid]中
- 完全處於子數組A[mid+1…high]中
- 跨越中點
即最大子數組爲三種情況的所有子數組中和最大者。
跨越中點的情況比較容易,只需找到形如A[i…mid]和A[mid+1…j]的最大子數組併合並:
該方法花費Θ(n)時間。
由此即可設計出求解最大子數組問題的分治算法:
建立遞歸式來描述該算法運行時間:
使用主方法可求出其解爲T(n)=Θ(nlgn),優於暴力求解的方法。
矩陣乘法的Strassen算法
考慮矩陣乘法問題,即:
常規計算方法:
該方法花費Θ(n3)時間。
使用分治方法計算矩陣乘法C=A·B,假定三個矩陣都是nxn,n爲2的冪,將每個矩陣分解爲4個n/2xn/2的子矩陣,於是矩陣乘法改寫爲:
直接進行遞歸分治算法:
其中矩陣分解時使用下標計算,花費Θ(1)時間,8次遞歸調用花費8T(n/2)時間,4次矩陣加法花費Θ(n2)時間,所以總的運行時間爲:
Strassen方法在此基礎上減少了一次矩陣乘法。其步驟如下:
- 將矩陣A、B、C分解爲n/2xn/2的子矩陣,花費時間Θ(1)
- 創建10個n/2xn/2的矩陣S1…S10,每個矩陣保存步驟1中創建的兩個子矩陣的和或差,花費時間Θ(n2)
- 用子矩陣和10個矩陣遞歸的計算7個矩陣積P1…P7,每個P矩陣都是n/2xn/2的。
- 通過P矩陣進行加減運算得到C矩陣的4個子矩陣,花費時間Θ(n2)
其中步驟2中創建的矩陣:
步驟3中的7次矩陣乘法:
步驟4中的矩陣加減法:
該算法運行時間:
由主方法可求得T(n)=Θ(nlg7)。