算法導論 第4章 分治策略(1)

算法導論 第4章 分治策略(1)

分治策略 的三個步驟:

  1. 分解爲若干子問題,子問題形式與原問題相同,但規模更小
  2. 遞歸地解決子問題,若子問題規模足夠小則停止遞歸,直接求解
  3. 合併爲原問題的解式

足夠大需要遞歸求解的子問題稱爲 遞歸情況,不再需要遞歸的足夠小的子問題稱爲 基本情況

求解遞歸式,即得到算法的Θ或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方法在此基礎上減少了一次矩陣乘法。其步驟如下:

  1. 將矩陣A、B、C分解爲n/2xn/2的子矩陣,花費時間Θ(1)
  2. 創建10個n/2xn/2的矩陣S1…S10,每個矩陣保存步驟1中創建的兩個子矩陣的和或差,花費時間Θ(n2)
  3. 用子矩陣和10個矩陣遞歸的計算7個矩陣積P1…P7,每個P矩陣都是n/2xn/2的。
  4. 通過P矩陣進行加減運算得到C矩陣的4個子矩陣,花費時間Θ(n2)

其中步驟2中創建的矩陣:

步驟3中的7次矩陣乘法:

步驟4中的矩陣加減法:



該算法運行時間:

由主方法可求得T(n)=Θ(nlg7)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章