算法第二章实践报告

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

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

3.算法描述:

通过分析,很容易发现最大子序列和只有三种情况:

出现在数组的左半部分
出现在数组的右半部分
出现在数组的中间部分,横跨左右两部分

而且对于左半部分或者右半部分,上述结论也成立。

利用这特性,可以写出相应的递归,递归结束的条件是当只有一个元素时,判断这个元素是否大于零,大于零便返回这个数,否则返回零。

然后求出左边最大值,右边最大值和横跨两边的最大值,返回这三个值中的最大值。

4.算法时间及空间复杂度分析:设总的时间复杂度为T(N),分成两份每边都是T(N/2),还要加上算跨越分界线部分O(N)(表示每一个元素都扫描了一遍,即N的常数倍,每一次求跨越边界的子列都要扫描左右两边的元素,每个元素多会扫描一遍以上)设分k次递归终止,则k =logN, 左右两边相等。T(1)=O(1),k =logN,   ckN=cNlogN=O(NlogN)。

当两个复杂度在一起时我们取大的那个O(NlogN),

5.心得体会:肯定要比暴力拆解好很多,但是上网了解了还有一种在线处理算法(动态规划),感觉更优。

 

posted @ 2020-10-03 21:05  莫若以明8848  阅读(129)  评论(0编辑  收藏  举报