求序列的最大子序列

看《编程珠玑》一书,讲解求序列的最大子序列。

问题: 给定一个实数序列x1,x2,…,xn(不必是正数),寻找一个连续的子序列xi,x(i+1),…,xj,使得其数值之和在所有连续子序列数值之和中是最大的。

 算法1

思路:比较所有连续序列数值的和,找到最大的。

1. maxsofar=0;

2. for i=[0,n)

3.   sum=0;

4.   for j=[i,n)

5.      sum=sum+x[j];  

6.      maxsofar=max(sum,maxsofar);

算法复杂度是O(n2)。

 

算法2

思路:在算法1的基础上改进。算法1中,第5行要重复求和。用一个数组预先存放从数组第一个元素开始到各个元素之间所有元素的和。比如定义数组 a[n+1],

a[0]=0,a[i]=x0+x1+…+x(i-1),(1=<i<=n)。

 

a[0]=0;

for i=[1..n]

   a[i]=a[i-1]+x[i-1];

maxsofar=0;

for i=[0,n)

sum=0;

for j=[i,n)

    sum=a[j+1]-a[i];

    maxsofar=max(sum,maxsofar).

 

算法复杂度是O(n2)。

 

算法3

思路:运用归纳法的思想。如果已知x[0…i-1]的最大子序列,那么能知道x[0…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值