1.请以伪代码描述最大字段和的分治算法
将序列a[1:n]分成长度相等的两段a[1:n/2]和a[n/2+1:n],则a[1:n]的最大子段和有三中情形:在[1, n/2]内;在[n/2+1, n]内;在起点位于[1,n/2],终点位于[n/2+1,n]内。
int SumMax(int a[],int left,int right)
{
int sum = 0;
int mid = (left + right) / 2;
if (left == right)
{
if (a[left] > 0)
sum = a[left];
else
sum = 0;
}
}//判断临界
int sum1 = 0;
int leftsum = 0;
for (int i = mid; i >= left; i--)
{
leftsum += a[i];
if (leftsum > sum1)
sum1 = leftsum;
}//最大字段和在左边的情况
if (sum < leftsum)
sum = leftsum;
if (sum < rightsum)
sum = rightsum;//比较三种情况
2.分析该算法的时间复杂度
T(n)=2T(n/2)+O(n)
T(n)=O(nlogn)
3.分治法的核心思想是将一个问题规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立并且与原问题的解决方式相同,递归求解完子问题,然后根据需求决定是否将子问题的解进行合并得到原问题的解。这也是分治法的基本思想, “分而治之”。通过使用分治法能将一些较大规模的问题用更快的时间求解,但是有时问题规模过大,因为递归过深,其空间、时间效率都会变得很低。
标签:int,sum,分治,问题,算法,leftsum,第二章,心得,left From: https://www.cnblogs.com/plxgdufs/p/16732687.html