利用分治法求最大子陣列

2021-06-21 14:41:45 字數 1259 閱讀 3144

利用分治法求解最大連續子陣列問題:

1、將陣列均分兩段,遞迴分治。

2、對於每層分治,最大子陣列要麼出現在左段或者右段,要麼出現在包含中點的連續陣列中,從中點出發向左右遍歷求最大陣列。

3、每層最大子陣列為左段最大子陣列,右段最大子陣列及包含中點的最大子陣列的最大值。

**如下:

#include #include #include using namespace std;

/* * name : find max subarray

* author : sangoly

* o(nlgn)

* date : 2014/4/18

*/ class maxsubarrayinfo

int maxleftindex;

int maxrightindex;

int maxsum;

bool operator>=(const maxsubarrayinfo& info)

bool operator==(const maxsubarrayinfo& info)

bool operator<(const maxsubarrayinfo& info)

};maxsubarrayinfo& findmaxcrossingsubarray(int array, int left, int middle, int right)

}int rightmaxsum = min;

int rightsum = 0;

int rightmaxindex = middle + 1;

for (int i=middle+1; i<=right; i++)

}maxsubarrayinfo *ret = new maxsubarrayinfo(leftmaxindex, rightmaxindex, leftmaxsum+rightmaxsum);

return *ret;

}maxsubarrayinfo& findmaxsubarray(int array, int left, int right)

else

}int main(int argc, const char **argv)

; maxsubarrayinfo result = findmaxsubarray(a, 0, 15);

cout<<"one max subarray info(index from 0) :" << endl;

cout<<"left index : " <

利用分治法求解最大子陣列和

乙個陣列的最大子陣列和可能存在於三種情況中 1.該陣列的左子陣列中 2.該陣列的右子陣列中 3.可能橫跨左右子陣列 所以,我們可以將問題分解成乙個個的子問題,其中情況1和2可用遞迴求解,而情況3則需要計算 s1 max 1 i n 2 s2 max n 2 1 j n 其中情況3中s1必然包含了 s...

分治法求最大子串

最近在學分治法,涉及到很多問題都能用分治法解決,漢諾塔,快排,歸併排序等,下面是解決最大字串問題。1,用分治法解決,下面還介紹不用分治解決的另一種方法。include 分治法 int countstring int a,int start,int end void main int v counts...

分治策略 求最大子陣列

只有當陣列中包含負數時,最大子陣列問題才有意義。如果所有元素都是非負的,最大子陣列問題沒有任何意義,因為整個陣列和肯定是最大的 1 public class findmaxsubarraydemo 4int result arr findmaximumsubarray arr,0,arr.lengt...