天天看點

算法---->分治法

一、分治法

對于一個規模為n的問題,若該問題可以容易地解決(比如說規模n較小)則直接解決,

否則将其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞歸地

解這些子問題,然後将各子問題的解合并得到原問題的解。這種算法設計政策叫做分治法。

二、一般步驟:

1.

劃分步驟:在算法的這個步驟中,把輸入的問題執行個體劃分為k≥1 個子問題,每個執行個體的規模嚴格小于問題的原始規模n。一般來說,應盡量将k 個子問題的規模大緻相同。k=2 是最通常的情況,有時也有k=1 的劃分。

2.

治理步驟:當子問題的規模大于某個預定的門檻值時,這個步驟是由k個遞歸調用組成的;如果子問題的規模小于門檻值時則直接對問題進行求解。

3.

組合步驟:這個步驟是組合k 個子問題的解來得到期望的原問題的解。組合步驟對分治算法的性能起到非常關鍵的影響,算法的效率在很大程度上依賴于組合步驟地實作。

三、時間估計

四、例子

4.1、尋找具有n 個元素的數組a[0, n-1]中的最大與最小元素

種解決這個問題的方法是使用分治法:可以把數組a 分成大小相等的兩個數組a1 和a2,在a1 和a2 中分别找出最大和最小元素,然後比較a1 和a2 中的最大和最小元素,兩個最大元素中大的就是原數組中的最大元素,兩個最小元素中小的就是原數組中的最小元素。為了要在a1 和a2 中找到最大與最小元素,可以重複上述過程,分别将a1 分為a11、a12 以及将a2 分為a21、a22,該過程可以一直進行下去,直到在某次分割後的數組中元素的個數少于三個的時候,此時最多隻需要一次比較就可以找出該數組中的最大和最小元素。

4.2、選擇問題

使用分治法在Θ(n)時間内就可以找到中項或第k小項的算法。

設計算法來尋找數組a 的中項或第k小元素:

⑴ 當n ≤n0時,直接對數組排序,傳回第k個元素即可,否則轉⑵。

⑵ 把元素劃分為p = n/5組,每組5個元素,不足5 個元素的忽略。

⑶ 取每組的中項,構成一個規模為p 的數組M。

⑷ 對數組M 遞歸求出其中項mm。

⑸ 使用mm 将原數組分成3 部分:a1 存放小于mm的元素,a2 存放等于mm的元素,a3 存放大于mm 的元素。

⑹ 分三種情況分别處理a1、a2、a3

如果|a1|≥k,對a1 遞歸執行算法;否則

如果|a1|+|a2|≥k,mm 是第k 小元素,傳回;否則

對a3 遞歸執行算法。

4.3、矩陣乘法

4.3.1、傳統方法

算法---->分治法

4.3.2、簡單分治法

算法---->分治法

劃分步驟:将矩陣A、B 分成4 個n/2×n/2 的矩陣;

治理步驟:當n>1 時,遞歸計算8 個n/2×n/2 的矩陣的乘積;

組合步驟:計算治理步驟得到n/2×n/2 的矩陣的和。

4.3.3、Strassen矩陣乘法