一、 最大字段和分治法
在用分治法求解最大字段和问题时,可以大致分为以下三种情况:
- 当最大子段和位于数组最左边的时候
- 当最大字段和位于数组最右边的时候
- 当最大子段和包含所选的界定值,也就是在界定值的两侧的时候
第一种情况,当最大子段和位于数组最左边的时候,通过不断地递归,保留最大的子段和,最后相加
第二种情况,当最大子段和在数组右边的时候,也是通过不断地递归,最后相加
第三种情况,当界定值包含在最大子段和中的时候,取得的界定值往左右两边分别寻找,最后相加
代码如下:
附上代码段:
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 mid=(left+right)/2;
int leftSum=maxSum(a,left,mid); //递归求取左边最大字段和
int rightSum=maxSum(a,mid+1,right); //递归求取右边最大字段和
int s1=0;
int left1=0;
for(int i=mid;i>=left;i--) //界定值左边最大和
{
left1+=a[i];
if(left1>s1) s1=lefts;
}
int s2=0;
int right2=0;
for(int i=mid+1;i<right;i++) //界定值右边最大和
{
right2+=a[i];
if(right2>s2) s2=right2;
}
sum=s1+s2; //中间字段最大和
if(sum<leftSum) sum=leftSum;
if(sum<rightSum) sum=rightSum;
}
return sum;
}
二、最大字段和分治算法时间复杂度分析
分解子问题时间复杂度为O(1),求解子问题时间复杂度为2T(n/2),合并子问题算法时间复杂度为O(n)
根据主定理得:T(n)=2T(n/2)+O(n)=O(nlogn)
三、对分治法的体会与思考
分治法的基本做法是将规模为n的问题分解为k个规模较小的问题,这些子问题相互独立且与原问题相同,通过递归解决子问题并合并得到原问题的解。
与原问题相比,分治法时间效率得到优化。
分治法中最重要的是递归的思想。
通过学习分治法,一些问题规模较大的问题得到了高效的解决。除了课堂所学的示例,实际生活中也有许多问题需要用到分治的思想。在以后的学习生活中也要活学活用。