在分治策略中我們將遞迴的求解乙個問題,在每層遞迴中有如下三個步驟。
分解將問題劃分為一些子問題,子問題形式與原問題一樣,只是規模更小。
解決遞迴的求解出子問題。如果子問題規模足夠小,則停止遞迴,直接求
解。合併將子問題的解合併為原問題的解。
需要遞迴求解時,我們稱之為遞迴情況,當子問題足夠小時,不需要遞迴時,
我們稱之為遞迴已經觸底,進入基本情況。
遞迴式
乙個遞迴式就是乙個不等式或等式,通過更小的輸入來描述乙個函式。
三種求解遞迴式的方法
代入法猜測乙個界,並用數學歸納法證明。
遞迴樹法將遞迴式轉換為一棵樹,其節點表示不同層次的遞迴呼叫後產生的
代價。然後採用邊界技術來求解遞迴式。
主方法t(n) = at(n/b)+f(n)
最大子陣列問題
分治策略求解方法
分析
可以將陣列分為兩個子陣列,那麼最大子陣列一定在前乙個子陣列中或後乙個子陣列中
或經過兩子陣列中間。
可以遞迴的求解各子陣列最大子陣列,最後合併問題得出原問題最大子陣列。
原書偽**(查詢經過前後子陣列的最大子陣列 即中間情況)
find-max-crossing-subarry(a,low,mid,high)
left-sum = -∞ //左子陣列最大子陣列之和
sum = 0
for i = mid downto low //查詢經過中間項的最大左子陣列
sum = sum + a[i]
if sum > left-sum
left-sum = sum
max-left = i
right-sum = -∞ //右子陣列最大子陣列之和
sum = 0
for j = mid + 1 to high //查詢經過中間項的最大右子陣列
sum = sum + a[j]
if sum > right-sum
right-sum = sum
max-right = j
return(max-left,max-right,left-sum + right-sum) //合併即為最大中間子陣列
c語言實現(例 查詢乙個10項陣列的最大子陣列)
#include#includetypedef structmystruct; //定義結構體用來儲存最大子陣列
mystruct midmax(int a,int low,int mid,int high) //結構體函式傳遞每層遞迴最大中間子陣列
}max = max+maxsum;
sum = 0;
maxsum = -100;
for(j = mid+1;j<=high;j++) //查詢經過中間項最大右子陣列
}max = max+maxsum; //確定最大中間子陣列
midside.leftmax1 = leftmax;
midside.rightmax1 = rightmax;
midside.maxsum1 = max;
return midside;
}mystruct digui(int a,int low,int high)
//遞迴部分
else //比較每層左最大子陣列,右最大子陣列,中間最大子陣列,確定該層最大子陣列
}int main()
演算法導論 最大子陣列
之前都在準備考試,寒假還是繼續學習。除了家裡打掃衛生,似乎也確實沒什麼事。多看書,多寫 總能提高的。堅持。這次學到了函式返回值可以是乙個結構體,當我們要返回多個值的時候,就可以返回結構體。還有就是對分治法有了更深的認識。include typedef struct op op findmaxcros...
演算法導論2 最大子陣列
最大子陣列問題 假設陣列a low.high 求存在於陣列a中的連續子陣列之和 或陣列中連續元素之和 最大的子陣列,例如a 4 的最大子陣列為a 0 2 和最大為3 2 1 2。如果採用暴力求解的演算法則問題也可以很簡單的求解出來,不過這種方法的時間複雜度為 n 所以寫一下更好的方法。使用分治策略的...
演算法導論 尋找最大子陣列
求最大子陣列 include using namespace std struct result structure result structure mid array sum int a,int low,int mid,int high sum 0 result.high index mid 1...