434
社区成员
发帖
与我相关
我的任务
分享一、以伪代码描述最大字段和的分治算法
分治法的基本思想是将一个问题规模为n的问题分解为k个规模较小的子问题。
int maxSubSum(int *a, int left, int right) {
if (left == right) {
return a[left] < 0 ? 0 : a[left];
}
int centor = (left + right) / 2;
int leftSum = maxSubSum(a, left, centor);
int rightSum = maxSubSum(a, centor + 1, right);
int s1 = 0;
int lefts =0;
for (int i = centor; i >= left; i--)
{
lefts += a[i];
if (lefts > s1) s1 = lefts;
}
int s2 = 0;
int rights = 0;
for (int i = centor + 1; i <= right; i++)
{
rights += a[i];
if (rights > s1) s1 = rights;
}
int sum = s0 + s1;
sum = max(sum, leftSum);
sum = max(sum, rightSum);
return sum;
}
int maxSum(int *a, int n) {
return sumSubSum(a, 1, n);
}
二、算法时间复杂度
T(n) = O(1) + 2T(n/2) + O(n)
三、对分治法的体会和思考
1、当问题规模小到一定程度可以解决那么可以使用分治法;
2、子问题的解可以合并成该问题的解;
3、分治算法时间复杂度为O(nlogn),并且是稳定排序。