分治法解決最大子陣列問題

2021-08-23 14:42:44 字數 1737 閱讀 8261

問題:輸入乙個整形陣列(有正數也有負數),陣列中連續的、乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。

輸入:測試陣列1, -2, 3, 10, -4, 7, 2, -5;

輸出:最大子陣列為3, 10, -4, 7, 2;

輸出最大子陣列的和為18 。

總體思路:

蠻力法是最簡單的實現方法,只要列出陣列所有可能的組合,然後找出其中和最大的組合即可;

蠻力法分三層迴圈實現:

1)第一層迴圈用於固定子陣列的起始位置;

2)第二層迴圈用於確定子陣列的結束位置;

3)第三層迴圈用於子陣列和的計算,從子陣列的頭開始遍歷到其尾,累加起來就是該子陣列的和。

**實現:

1

int forsemax(int *arry,int n,int &_start,int &_end)215

if(sum>_max)

1621}22

}23return _max;//

返回最大和

24 }

總體思路:分治法的精髓:

1)分--將問題分解為規模更小的子問題;

2)治--將這些規模更小的子問題逐個擊破;

3)合--將已解決的子問題合併,最終得出「母」問題的解;

所以原陣列的最大子陣列求法:

1)分--將原陣列拆分成兩部分,每個部分再拆分成新的兩部分......直到陣列被分得只剩下乙個元素;

2)治--每個小型的陣列找最大子陣列,只有乙個元素的陣列,解就是該元素;

3)合--將兩個小型陣列合併為乙個陣列,其中解有三種可能:

返回值應選最大的;

模組實現:

1

int divide(int *arry,int l,intr)2

20 }

難點解說:其中難點在於兩個陣列合併的時候,位於兩個陣列中間位置存在最大和的情況,處理方法為:

從中間位置開始,分別向左和向右兩個方向進行操作,通過累加找到兩個方向的最大和,分別為l_max和r_max,因此存在於中間的最大和為(l_max+r_max);

向左的累加操作和向右的累加操作完全一樣,只需要一層迴圈就可以解決問題:

1)初始化l_max、r_max為最小值,命sum=0用於累加;

2)在向左累加的操作中,sum從中點開始向左逐個累加,累加完乙個元素後與l_max相比,l_max保留值較大的乙個;

3)等遍歷完左邊部分l_max的值得以確認,並用同樣的方法確認r_max的值;

4)最後返回(l_max+r_max)的值。

具體**實現如下:

1

int middlemax(int *arry,int l,int r,intm)2

13 sum=0;14

for(i=m+1;i//

中線開始向右尋找

1520

return (l_max+r_max);//

返回左右之和

21 }

分治法解決最大子陣列問題

利用分治法解決最大子陣列問題 對給定的陣列得到該陣列中具有最大和的子陣列 對於給定的整數陣列a,求出陣列中具有最大和的子陣列,最大和以及左右下標 思路 採用分治的方法,將陣列分為兩部分,則有最大和的子陣列共有三種情況 在陣列左邊,在陣列右邊,跨越陣列中點 include using namespac...

分治法解決最大子陣列問題

演算法導論中一道很有趣的演算法入門題目,問題是解決最大子陣列的問題,給你乙個陣列,要求你求出其中和最大的連續子陣列,最簡單的思考方式就是暴力求解,對所有的情況都進行組合然後得出最大值,但是這個複雜度是n 為了減少複雜度,演算法導論提供了一種思路,就是用分治法解決最大子陣列的問題 我們首先將要求的陣列...

分治法解決最大子陣列問題

問題 輸入乙個整形陣列 有正數也有負數 陣列中連續的 乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。輸入 測試陣列1,2,3,10,4,7,2,5 輸出 最大子陣列為3,10,4,7,2 輸出最大子陣列的和為18 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...