432
社区成员
发帖
与我相关
我的任务
分享
1、请以伪代码描述最大字段和的分治算法
int max(int a[],int left,int right)
{
if(left == right) return a[left];
else
{
int mid = (left+right)/2;
Sum-left =max(a,left,mid);
Sum-right = max(a,mid+1,right);
Sum1 = 0;
left_sum = 0;
for(int i =mid;i>left;i--)
{
left_sum = left_sum + a[i];
sum1 = max{sum1,left};
}
sum2 = 0;
right_sum = 0;
for(int i=mid+1;i<right;i++)
{
right_sum = right_sum + a[i];
sum2 = max{sum2,right_sum};
}
sum = sum1 + sum2;
sum = max{sum,Sum-left};
sum = max{sum,Sum-right};
return sum;
}
}
2、分析该算法的时间复杂度
拆分子数组分别求得的最大子段和为sum1,sum2。时间复杂度为2T(n/2),从中心点向两边找最大的和,找到跨越的最大子段和的时间复杂度为O(n), 所以总体的时间复杂度为:T(n)=2T(n/2)+O(n) = O(nlogn)。
3、结合本章的学习,你对分治法的体会和思考
分治法在每层递归时都有三个步骤:
分解:即将原问题分解为若干子问题,而这些子问题都是原问题较小规模的实例。
求解:递归求解各个子问题,若子问题规模足够小,则可直接求解。
合并:合并子问题的解成原问题的解。
我们时常可以将一件大规模的问题变成几个小规模的问题来进行处理,最终将其进行合并整合,从而提升解决问题的效率。