分治策略 求最大子陣列

2022-07-16 23:15:16 字數 1337 閱讀 6837

只有當陣列中包含負數時,最大子陣列問題才有意義。如果所有元素都是非負的,最大子陣列問題沒有任何意義,因為整個陣列和肯定是最大的

1

public

class

findmaxsubarraydemo ;

4int result_arr = findmaximumsubarray(arr, 0, arr.length - 1);

5for (int i = 0; i < result_arr.length; i++) 8}

9/*10最大陣列問題:使用分治策略

11分析:1.要將大陣列劃分為兩個規模盡量相等的子陣列,也就是找到大陣列的**位置mid,

122.求解兩個子陣列a[low,mid]和a[mid+1,high]

133,那麼所求的最大陣列a[i,j]就只用三種情況

14* 第一種情況:完全位於a[low,mid],因此low <= i <= j <= mid;

15* 第二種情況:完全位於a[mid+1,high],因此 mid+1 <= i <= j <= high;

16* 第三種情況:跨越了中點,因此low <= i <= mid j <= high;

174.可以遞迴第一種和第二種情況的最大子陣列問題,因為兩個子問題仍然是最大陣列問題,只是規模更小

185.因此,只要尋找跨越中點的最大子陣列

196.最後進行三者比較選取最大值的問題。

20*/

21public

static

int findmaxcrossingsubarray(int arr, int low, int mid, int high) 34}

35 sum = 0;

36for (int i = mid + 1; i <= high; i++) 42}

43 result_arr[0] =max_left;

44 result_arr[1] =max_right;

45 result_arr[2] = left_sum +right_sum;

46return

result_arr;47}

4849

public

static

int findmaximumsubarray(int arr, int low, int

high) else

else

if (right_result_arr[2] >= left_result_arr[2] && right_result_arr[2] >= cross_result_arr[2]) else68}

69}70 }

分治策略之最大子陣列

分治策略是將父問題差分成的多個子問題,然後遞迴的方式解決子問題。整個思想和動態規劃類似,不過分治策略不要求最優解問題,而只是把父問題分解成子問題。步驟 分解 divide 先將問題劃分成子問題。子問題的形式與原問題相同。解決 conquer 遞迴解決問題,當問題縮小到一定程度就能夠直接求解。合併 c...

分治策略之最大子陣列問題

問題 乙個整數陣列中的元素有正有負,在該陣列中找出乙個連續子陣列,要求該連續子陣列中各元素的和最大,這個連續子陣列便被稱作最大連續子陣列。比如陣列的最大連續子陣列為,最大連續子陣列的和為5 2 1 2 8。一 暴力解法 include using namespace std class soluti...

分治策略之最大子陣列問題

最大子陣列,即子陣列中的各個元素相加的和是所有子陣列中最大的。假設最大子陣列為 ai.aj 則必然是以下三種情況 1 完全位於子陣列a low.mid 中 2 完全位於子陣列a mid 1.high 中 3 跨越了中點low i mid j high 如果暴力求解的話,時間複雜度為 n int fi...