算法第二章实践报告
1.实践题目名称:最大子列和问题
2.问题描述:给定K个整数组成的序列{ N1, N2, …, NK },“连续子列”被定义为{ Ni, Ni+1, …, Nj },其中 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.心得体会:肯定要比暴力拆解好很多,但是上网了解了还有一种在线处理算法(动态规划),感觉更优。