434
社区成员
发帖
与我相关
我的任务
分享1.以伪代码描述最大字段和的分治算法
此题所使用的分治法基本思想为将原问题分解为各个子问题,各个子问题相互独立,递归求解子问题,简化原问题,从而得到结果。
伪代码描述最大子段和问题解法如下:
left=1,right=n;
mid=(left+right)/2;
sumleft=Max(a,left,mid);//求出左序列最大子段和
sumright=Max(a,mid+1,right);//求出右序列最大子段和
//Max递归函数:用于求出现有序列的最大子段和
int Max(int a[ ],int l,int r)
{
int left=0;//求出左段最大子段和
int s1=0;
for(int i=mid;i>=l;i--)
{
s1=s1+a[i];
if(left>s1)
s1=left;
}
int right=0;//求出右段最大子段和
int s2=0;
for(int j=mid+1;j<=r;j++)
{
s2=s2+r[j];
if(right>sum2)
sum2=right;
}
int sum=s1+s2;//求出整个子段的最大子段和
if(sum<s1)
sum=s1;
else if(sum<s2)
sum=s2;
return sum;
}
2.时间复杂度
T(n)=2T(n/2)+n. 根据主定理可知,时间复杂度为O(nlogn)
3.对分治法的体会和思考
在本章的学习中,我了解到了分治法作为一种基本的算法,它的意义是尽可能地提高算法效率,快速得到所求问题的结果,将规模较大的问题分解为了小的子问题,通过对子问题的解决与递归,从而求得大问题。同时,分治法也给了我们学习的提示,对于学习而言,我们总会遇到各类难题,但我们可以考虑用“分治法”的思想去解决问题,不要害怕困难,将大的问题看作一个个小问题去攻克解决,那么我们便能拿下难题。