算法第二章上机实践报告

1.实践题目:最大子列和问题

2.问题描述:

给定K个整数组成的序列{ N1, N2 , ..., NK},“连续子列”被定义为{ N​i , Ni+1 ,..., Nj},其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

3.算法描述:

运用分治法,分析问题得出最大子列和的分布有三种情况:(1)左子序列;(2)右子序列;(3)位于中部的横跨左右的子序列。

递归结束的条件:left=right,若left>0,则返回a[left],否则返回0。

依次得出左子序列的最大子列和,右子序列的最大子列和,横跨左右的子序列的最大子列和,并比较得出最大者。

4.算法时间及空间复杂度分析:

设用T(n)表示解决该问题所需的时间,分解子问题所需时间为O(1),对该问题分成2个规模为n/2的子问题则所需时间为2T(n/2),合并子问题所需时间为O(n);

            {O(1)

则T(n)={2T(n/2)+O(n)

由于a=2, b=2, d=1,得到d=logb a

所以时间复杂度为O(nlogn)

5.心得体会:

刚开始写的时候发现了一个问题,如:

int leftmaxsum=Maxsum(a, left, mid);//左序列最大字段和
int rightmaxsum=Maxsum(a, mid+1, right);//右序列最大字段和

这是正确的写法,以下是我刚开始写的错误写法

int leftmaxsum=Maxsum(a, left, mid-1);//左序列最大字段和
int rightmaxsum=Maxsum(a, mid, right);//右序列最大字段和

这会导致当left=0,right=1时,mid-1=-1越界的情况

同时也在网上了解到动态规划的方法,时间复杂度为T(n)=O(n),在此题的限制下两者差不太多

 

posted @ 2020-10-03 21:52  Sullivan2333  阅读(97)  评论(0编辑  收藏  举报