434
社区成员
发帖
与我相关
我的任务
分享利用分治思想将给定序列从中间分成左右两段,并在分开后的序列上继续递归调用该方法。每个子问题往左、往右以及中间分别求最大子段和,最后合并子问题,得到原序列的最大子段和。
伪代码:
int findmaxsum(int a[], int left, int right){
if(left == right){
if(a[left] < 0) return 0;
else return a[left];
}
else{
// 左段最大和
int leftmax = findmaxmax(left, mid);
int rightmax = findmaxmax(mid+1, right);
int leftsum = 0;
leftsum += a[left--];
if(maxsum < leftsum) maxsum = leftsum;
// 右端最大和
int rightsum = 0;
rightsum += a[right++];
if(maxsum < rightsum) maxsum = rightsum;
int sum = 0;
sum = leftsum + rightsum;
// 对比左、右、中的子段和,选择最大者
sum = Max(leftmax,rightmax,sum);
}
return sum;
}
分解子问题时间复杂度为常数级O(1),求解子问题的时间复杂度2T(n/2),合并子问题时间复杂度O(n)。
根据:
T(n)=2T(n/2)+O(n)
该算法的时间复杂度为:O(nlogn)
对于能够将原问题分解成多个与原问题相同的子问题,可以通过递归的方式将原问题不断分解,再分别对小问题进行处理,最终合并小问题,得到原问题的答案。此方法在某些情况下能够大大提高处理问题的效率。