算法第二章心得

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个规模较小的子问题,这些子问题互相独立并且与原问题的解决方式相同,递归求解完子问题,然后根据需求决定是否将子问题的解进行合并得到原问题的解。这也是分治法的基本思想, “分而治之”。通过使用分治法能将一些较大规模的问题用更快的时间求解,但是有时问题规模过大,因为递归过深,其空间、时间效率都会变得很低。

 

posted @ 2022-09-26 21:57  彭羚欣  阅读(19)  评论(0)    收藏  举报