434
社区成员
发帖
与我相关
我的任务
分享一、请以伪代码描述最大字段和的分治算法
运用分治算法求解最大字段和,最大值会出现三种情况:
将所给序列a[1:n] 分成a[1:n/2] 和 a[n/2 + 1 : n]两个部分,最大字段和要么完全在左边部分,要么完全在右边部分,要么就在左边和右边连接的中间部分
伪代码求解如下:
int MaxSum(int* a, int left, int right)
{
int k, sum = 0;
if (left == right)
{
return a[left] >= 0 ? a[left] : 0;
}
else
{
int mid = (left + right) / 2;
int lsum = MaxSum(a, left, mid);
int rsum = MaxSum(a, mid + 1, right);
int s1 = 0;
int lefts = 0;
for (k = mid; k >= left; k--)
{
lefts += a[k];
if (lefts > s1)
s1 = lefts;
}
int s2 = 0;
int rights = 0;
for (k = mid + 1; k <= right; k++)
{
rights += a[k];
if (rights > s2)
s2 = rights;
}
sum = s1 + s2;
if (sum < lsum)
sum = lsum;
if (sum < rsum)
sum = rsum;
}
return sum;
}
二、分析该算法的时间复杂度
三、结合本章的学习,你对分治法的体会和思考
分治法的本质就是划分子问题,求解子问题再合并,进而求解问题。我认为我们应该学习这种思想,比如遇到一些大项目,我们可以不断的划分一个一个小板块,慢慢解决,再合并起来,最终做成大项目。当然,分治法也有一些缺点,比如不适合求解规模较小的问题之类的。我们应该合理的运用分治法解决算法问题。