434
社区成员




1、请以伪代码描述最大字段和的分治算法
int maxSum(int a[],int left,int right) {
int sum = 0;
if(left == right)
{
if(a[left] > 0) sum = a[left];
else sum = 0;
}
else
{
int center = (left + right) / 2;
int leftsum = maxSum(a, left, center);
int rightsum = maxSum(a, center + 1, right);
int s1 ,lefts = 0;
for(int i = center ; i >= left; i--) {
lefts += a[i];
if(lefts > s1) s1 = lefts;
}
int s2 ,rights = 0;
for(int i = center + 1 ; i <= right; i++) {
rights += a[i];
if(rights > s2) s2 = rights;
}
sum = s1 + s2;
if(sum < leftsum) sum = leftsum;
if(sum < rightsum) sum = rightsum;
}
return sum;
}
2、分析该算法的时间复杂度
将数组一分为二,时间复杂度为O(1),不断求数组二分之一和的最大值,时间复杂度为 2T(n/2),合并子问题,时间复杂度为O(n)所以可得该算法的时间复杂度为O(nlogn)
3、分治法的体会和思考
运用分治法,可以将一个大问题分解为若干个子问题,递归地解决各个子问题,然后将各个子问题的解合并得到原问题的解。运用分治法,虽然提高了解决问题的空间复杂度,但是却可以降低时间复杂度,从而提高解决问题的效率,递归细化问题,使问题的复杂程度降低。该方法可以在许多例子中体现,如二分搜索、合并排序、大整数的乘法、快速排序等,我们应当学习并且熟练运用该方法,以在解决这类问题时可以达到更高的效率,让代码更简洁,时间复杂度更低。。相比于之前学习过的一些方法,分治法在时间效率上有更大的优势,非常值得我们学习和使用。