434
社区成员
发帖
与我相关
我的任务
分享1.请以伪代码描述最大字段和的分治算法
伪代码为:
算法:findmax( a , left , right )
输入:数组a,left,right(左,右边界)
输出:最大子段和和sum以及子段边界
代码段如下:
int findmax(int *a , int left , int right )
{
int sum = 0;
if(left == right) //临界条件
{
if(a[left] > 0) sum = a[left];
else sum = 0; //当都为负数时
}
else if(left > right) return 0;
else
{
int mid = (left + right) / 2; //划分为两段
int leftsum = findmax(a , left , mid);//递归,找左边的最大子段和
int rightsum = findmax(a , mid + 1 , right);//递归,找右边的最大子段和
int s1 = 0 , lefts = 0;
for(i = mid ; i >= left ; i--)// 从中点向左找最大字段和
{
lefts += a[i];
if(lefts > s1) s1 = lefts;
}
int s2 = 0 , rights = 0;
for(i = mid + 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(2/n)
合并子问题:O(n)
所以时间复杂度为:T(n) = O(1) + 2T(2/n) + O(n) = O(nlogn)
3.结合本章的学习,你对分治法的体会和思考
分治法主要就是将一个大规模的问题划分为多个小规模的子问题。分治法有一个临界条件,也就是最小阈值,结合递归算法将问题解决。但是分治法的子问题的规模大小也影响着其时间复杂度,所以要根据具体的情况划分子问题。
分治法的基本解决步骤为:
1.划分子问题;2.求解子问题;3.合并子问题。