算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间

算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间

ID:11779795

大小:22.90 KB

页数:5页

时间:2018-07-14

算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间_第1页
算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间_第2页
算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间_第3页
算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间_第4页
算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间_第5页
资源描述:

《算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间给定任一数字序列,如{-5,4,-20,16,-2,-3},求出其最大子序列和,绝对值最大子序列和以及对应的区间,在这个例子中,人肉计算可知最大子序列和为16,区间为[3,3)(数组下标从0开始),而绝对值最大子序列和为-21,区间为[0,2],那么算法如何描述及实现呢?在经典的书籍《数据结构与算法分析C语言描述第2版》中,作者向我们介绍了求最大子序列和的三种算法,时间复杂度从O(N3)下降到O(N),求最大子序列和绝对值和以及其区间是我对这一问题

2、的扩展。一、求最大子序列和以及其区间求最大子序列和的算法相对简单,并且可以使用动态规划思想将其优化至O(N),问题的关键:前面已输入的元素的计算结果并不依赖于后面的输入。O(N2)算法:N次遍历数组,对其中每一个元素,继续遍历后续每个元素,并求和,如发现比当前和大,替换当前和。C/C++实现:1intmaxsub(constinta[],intn)2{3intsum,max,i,j,begin,end;4begin=end=max=0;5for(i=0;i

3、9{10sum+=a[j];11printf("thesecondlevelloop%dloopsum=%d",j,sum);12printf("thesecondlevelloop%dloopmax=%d",j,max);13if(sum>max)14{15max=sum;16begin=i;17end=j;18}19}20printf("the%dloopmax=%d",i+1,max);21}22printf("--final--Begin=%d,End=%d",begin,end);23retur

4、nmax;24}循环结束后,begin与end的值即对应的区间。O(N)算法:动态规划思想,也称on-linealgorithm,即,对于每一个输入,不依赖于后面输入,对每一个输入,立即计算其结果,并保存,然后与后续输入进行比较,若和变大,产生更新。若和总是变小,丢弃之前的输入。C/C++实现:intmaxsublinear(constinta[],intn){inti;intcurSum=0;/*当前序列和*/intmaxSum=0;/*最大序列和*/intbegin=end=0;/*开始循环求子序列和*/for(i=

5、0;imaxSum){maxSum=curSum;end=i;}/*动态规划部分,舍弃当前和为负的子序列*/if(curSum<0){curSum=0;begin=i+1>=n?i:i+1;}}returnmaxSum;}二、求绝对值最大子序列和以及对应的区间这个问题是对第一个问题的扩展,但比第一个问题复杂的多,O(N2)算法基本相同,也容易理解。O(N2)C/C++实现:1intmaxabssub(co

6、nstinta[],intn)2{3intsum,max,i,j,begin,end;4begin=end=max=0;5for(i=0;imax)14{15max=abs(sum);16begin=

7、i;17end=j;18}19}20printf("the%dloopmax=%d",i+1,max);21}22printf("--final--Begin=%d,End=%d",begin,end);23returnmax;24}O(N)算法,在竹风抚荷塘同学的帮助下,顺利求解。思路其实很简单,绝对值最大的子序列和,要么是和最大,要么是和最小,类似问题一中O(N)算法,同时求每一个输入可能得到的最大和或最小和,再比较即可。下面是C/C++代码实现: 1intmaxAbsSubLinear(inta[],int

8、n)2{3intposiSum,negaSum,curSum,max,j,begin,end,posiBegin,posiEnd,negaBegin,negaEnd,flag;4posiSum=negaSum=curSum=max=j=begin=end=posiBegin=posiEnd=negaBegin=neg

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。