簡單的分治策略

2021-08-09 00:13:29 字數 2369 閱讀 6509

簡單的分治策略

分治,是程式設計中常用的一種策略,例如在歸併排序中就有使用。分治策略是一種遞迴求解問題的方法,在每層的遞迴中可分為三個步驟:分解(divide)解決(conquer)合併(combine)分解(divide)指的是將問題劃分為一些子問題,子問題與原問題具有相同的形式,但規模較之更小。解決(conquer)指的是遞迴的求解子問題,當問題規模足夠小時,直接求解並開始回溯。合併(combine)指的是將子問題得到的解進行合併。在問題規模較大,需要遞迴求解的時候稱之為遞迴情況(recursive case),子問題規模足夠小時,出現「觸底」時,就進入了可直接解決的基本情況(base case)

下面分析利用分治策略處理區域內峰值問題的簡單例子:求陣列的最大子陣列之和

假定有乙個整型陣列arr[low~high](為了簡化過程,使用簡單資料型別加以介紹,並且規定該陣列中元素數量不低於1個,不大於1000個),現需求出該陣列中的乙個和最大的子陣列以及它的和值。現在我們進行簡單分析,要得到該子陣列,我們需要知道它在原陣列中的邊界。原陣列可能可以劃分出乙個或乙個以上的子陣列,而和最大便成了我們找尋的依據。

對問題進行分解,假定arr[i~j]是我們要求的陣列,那麼原問題可以分成規模更小的問題,完全位於子陣列arr[low~mid]完全位於子陣列arr[mid+1~high],跨越中點mid(mid的值為(low+high)/2)。得到了規模更小的問題後,我們就可以對完全位於子陣列arr[low~mid]完全位於子陣列arr[mid+1~high]這兩個規模更小的問題進行遞迴求解了。然後我們只需要對跨越中點mid這種情況在單獨處理下,我們就能夠得到每層遞迴中的子問題的解了,然後再對子問題的解合併,當然這裡並不是意味著相加,而是依據我們的條件選擇和處理。

現在對子問題進行處理流程分析。先從特殊的情況開始:

1、計算low到mid範圍內的和值,記為左最大和值。

2、計算mid+1到high範圍內的和值,記為右最大和值。

3、計算左最大和右最大的和,記為跨越中點最大和值。

然後是完全位於子陣列arr[low~mid]完全位於子陣列arr[mid+1~high]這兩種情況,實際上這是處理上等同的情況,因為我們只需要同原問題一樣分解處理直到觸底發生。所以我們需要:

1、 先判斷觸底是否發生,觸底情況為low和high相等,此時只有乙個元素,和值就為該元素本身。

2、 獲取左最大

3、 獲取右最大

4、 獲取跨越中點最大

5、 合併處理三個最大,得到符合條件的子陣列和它的和值。

下面給出該問題的c語言主要原始碼:

#include#includetypedefstruct data

data;

voidfindcrosssubarr(long int *arr,int low,int mid,int high,data *crossresult)

}//右

sum=0;

for(j=mid+1;j<=high;j++)

}crossresult->sum=left_sum+right_sum;

retutn ;}

voidfindmaxsubarr(long int *arr,int low,int high,data *result)

//分解、解決部分

findmaxsubarr(arr,low,mid,&leftresult); // 左

findmaxsubarr(arr,mid+1,high,&rightresult); // 右

findcrosssubarr(arr,low,mid,high,&crossresult); // 跨越中點

// 合併處理部分

// 左

if((leftresult.sum)>=(rightresult.sum)&&(leftresult.sum)>=(crossresult.sum))

// 右

elseif((rightresult.sum)>=(leftresult.sum)&&(rightresult.sum)>=(crossresult.sum))

// 跨越中點

else

} intmain(void)

分治策略(入門)

小編今天學習了一下 分治策略 參考 演算法導論 並用python 實現了一下 例項中的 方法。大家一起相互學習啦。首先是 插入排序的方法 時間複雜度為 n 2 實現如下 插入排序法 a 2,1,6,5,4,8,9 for i in range int len a for j in range int...

分治策略 快速排序

快速排序演算法是基於分治策略的另乙個排序演算法。其基本思想是 對輸入的子陣列a p r 按以下三個步驟進行排序。1 分解 divide 以a p 為基準元素將a p r 劃分成3段a p q 1 a q 和a q 1 r 使得a p q 1 中任何乙個元素小於等於a q 而a q 1 r 中任何乙個...

遞迴與分治策略

1 全排列問題 設r n 是要進行排列的n個元素。集合x中元素的全排列記為perm x 求r n 的全排列perm r n 用遞迴演算法求解 1 找出遞迴子結構性質 即原問題的解包含了子問題的解,且子問題的描述與原問題相同。這就可以用子問題的解來構造原問題的解。設r i r n 這是乙個子問題。設 ...