1.请以伪代码描述最大字段和的分治算法(maxSum算法)
if left == right then
return a[left];//只有一个元素
mid <= (left + right) / 2;//将数组分为两部分 (1)
lmax <= maxSum(left, mid);//左半部分最大值
rmax <= maxSum(mid + 1, right);//右半部分最大值
clmax <= a[mid];//以mid开始左边连续子段的最大和 (2)
tmp <= a[mid];
for i <= mid - 1 to left do
i--;
tmp <= tmp + a[i];
if tmp > clmax then
clmax <= tmp;//若tmp大于左边最大值,则更新值
crmax <= a[mid + 1];//以mid+1开始右边连续子段的最大和 (3)
tmp <= a[mid + 1];
for i <= mid + 2 to right
i++;
tmp <= tmp + a[i];
if tmp > crmax then
crmax <= tmp;//若tmp大于右边最大值,则更新值
cmax <= clmax + crmax;//横跨两个子段的最大值 (4)
maxs <= max(max(lmax, rmax),cmax);//比较三个值,其中最大的为所求,即最大字段和
if maxs < 0 then
maxs <= 0;
return maxs;
2.分析该算法的时间复杂度
语句(1)为划分子问题,即将原问题的n个整数a1~an划分为两部分,时间复杂度为O(1);
语句(2)、(3)为分别求解子问题,即算出左半部分a1~a(n/2)和右半部分a(n/2+1)~an的最大字段和,为O(n);
语句(4)为合并子问题,即横跨左右两部分求解最大字段和,为T(n/2);
所以该算法时间复杂度为O(nlogn).
3.结合本章的学习,你对分治法的体会和思考
分治,即分而治之。将规模为n的问题分为规模为k的若干个子问题,这些子问题互相独立且与子问题相同,递归地解决这些子问题,然后将这些子问题的解合并得到原题的子问题。这种算法可以一定程度上的减少时间复杂度,提高效率,是很有用也很重要的算法。比如归并排序和快速排序都是基于分治法的,是非常重要的算法。