273
社区成员
发帖
与我相关
我的任务
分享
1.
把整个序列一分为二,此时最大字段和会出现三种情况,(1)最大字段在左半序列中,(2)最大字段在右半序列中,(3)最大字段横跨左右序列中
第一二种用递归继续一分为二,第三种像左开始找最大字段和,再向右开始找最大字段和,然后两个相加。
伪代码
int maxSum(int *a,int left,int right){
if(left == right)
return a[left];
int mid = (left+right) / 2;
int leftSum = maxSum(a,left,mid);
int rightSum = maxSum(a,mid+1,right);
int sl = 0;// 像左最大字段和
int nowLeftSum = 0;
for(int i = mid; i > left; i--){
nowLeftSum += a[i];
if(nowLeftSum > sl)
sl = nowLeftSum;
}
int sr = 0;
nowRightSum = 0;
for(int i = mid; i > left; i--){
nowRightSum += a[i];
if(nowRightSum > sr)
sr = nowRightSum;
}
int sum = sl + sr;
return sum;
}
2.算法复杂度为 O(nlogn);
3.总结
(1)任何可以用计算机求解的问题所需计算的时间都与其规模有关。问题规模越小,解题所需时间往往也越短,从而也比较容易处理。
(2)直接或间接的调用自身的算法称为递归算法。
(3)分治法的基本思想是将一个规模为n的问题分解成k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题的解合并得到原问题的解。