首页 > 编程语言 > 详细

算法第二章实践报告

时间:2020-10-04 00:22:24      阅读:42      评论:0      收藏:0      [点我收藏+]

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

 

算法第二章实践报告

原文:https://www.cnblogs.com/mikrokosmos/p/13765509.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!