-
请以伪代码描述最大字段和的分治算法
-
分析该算法的时间复杂度
-
结合本章的学习,你对分治法的体会和思考
1.请以伪代码描述最大字段和的分治算法
三种情况分析如下:
情况1:最大字段和全部取自左边
情况2:最大字段和全部取自右边
情况3:最大字段和两边都取
伪代码如下:
if (left == right) return a[left];
int mid = (left + right) / 2;//确定中间值
int l = sss(a, left, mid);//情况一
int r = sss(a, mid + 1, right);//情况二
int s1=0, s2=0, temp=0, m;//情况三
for (int i = mid; i >= left; i--)
{
temp += a[i];
if (temp >= s1) s1 = temp;
}
temp = 0;
for (int i = mid + 1; i <= right; i++)
{
temp += a[i];
if (temp >= s2) s2 = temp;
}
m = s1 + s2;
return max(max(l, r), m);
2.分析该算法的时间复杂度
每次将原问题分解成左右两个子问题,最后合并n个子问题的答案:
则T(n) = 2 T(n/2) + O(n),故T(n) = nlogn。
3.结合本章的学习,你对分治法的体会和思考
分治法的基本步骤是分 ,治 ,合。
其精髓在于:能够将问题分解为规模更小的子问题,然后将这些规模更小的子问题逐个击破,并将已解决的子问题合并,最终得出“母”问题的解;从而降低问题的难度,提高程序效率,为难题提供优秀的解决方案。