434
社区成员
发帖
与我相关
我的任务
分享首先将数组分为左右大概相等的两个子段,递归求解左子段和右子段的最大子段和,最后归并比较最大子段和。
分治法部分代码如下:
int MaxSum(int left,int right)
{
int sum=0,mid,lsum,rsum;
if (left==right)
{
return a[left]<0?0:a[left];
}
else
{
mid=(left+right)/2;
lsum=MaxSum(left,mid);
rsum=MaxSum(mid+1,right);
int s1=0,ls=0;
for (int i=mid;i>=left;i--)
{
ls+=a[i];
if (ls>s1)
s1=ls;
}
int s2=0,rs=0;
for (int i=mid+1;i<=right;i++)
{
rs+=a[i];
if (rs>s2)
s2=rs;
}
sum=s1+s2;
if (lsum>sum)
return lsum;
else if (rsum>sum)
return rsum;
else
return sum;
}
}
分解子问题:O(1)
求解子问题:2T(n/2)
合并子问题:O(n)
总时间复杂度:O(nlogn)
分治法通过将问题分为若干个规模较小的子问题,且这些子问题互相独立并与原问题相同,可以有效地降低时间复杂度,提高了算法的效率,在处理规模较大的问题时可以优先采用。