演算法導論筆記 最大子陣列C語言實現

2021-08-17 17:22:23 字數 1975 閱讀 3290

在分治策略中我們將遞迴的求解乙個問題,在每層遞迴中有如下三個步驟。

分解將問題劃分為一些子問題,子問題形式與原問題一樣,只是規模更小。

解決遞迴的求解出子問題。如果子問題規模足夠小,則停止遞迴,直接求

解。合併將子問題的解合併為原問題的解。

需要遞迴求解時,我們稱之為遞迴情況,當子問題足夠小時,不需要遞迴時,

我們稱之為遞迴已經觸底,進入基本情況。

遞迴式

乙個遞迴式就是乙個不等式或等式,通過更小的輸入來描述乙個函式。

三種求解遞迴式的方法

代入法猜測乙個界,並用數學歸納法證明。

遞迴樹法將遞迴式轉換為一棵樹,其節點表示不同層次的遞迴呼叫後產生的

代價。然後採用邊界技術來求解遞迴式。

主方法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...