最大子列和的在线打表算法

子列被定义为原连续的一段数字,找出具有列中li最大和的一段连续子列,返回它们的和。

一般通常的做法是穷举所有子列和,从中找出最大值。

int MaxSubsequence(int List[],int N)   /*List[]整数数组,N为数组长度*/

{

     int i,j;

     int ThisSum,MaxSum=0;

     for(i=0;i<N;i++)   /*i是子列左端位置*/

    {   

           ThisSum=0;

           for(j=0;j<N;j++)     /*j是子列右端位置*/

         {

                     ThisSum+=List[j];

                     if(ThisSum>MaxSum)

                      MaxSum=ThisSum;

          }

    }

           return MaxSum;    

时间复杂度O(N平方).

改进一下这个算法。利用在线处理可以使复杂度降为O(N)。

在线的意思是指每输入一个数据就进行即时处理,得到结果是对于当前已经读入的所有数据都成立的解,即在任何一个地方中止输入,算法都能正确给出当前的解。利用在线处理最大子列和的核心思想是:如果整数序列{a1,a2,a3......an}的最大和子列是{ai,ai+1...aj},那么必定有它们的累加和大于等于0.因此,一旦发现当前子列和为负,则可以重新开始考察一个新的子列。

int MaxSubsequence(int List[],int N)   /*List[]整数数组,N为数组长度*/

{

     int i;

     int ThisSum=MaxSum=0;

     for(i=0;i<N;i++)   

    {   

        ThisSum+=List[i];   /*向右累加*/

        if(ThisSum>MaxSum)

            MaxSum=thisSu;    /*发现更大和则更新当前结果*/

        else if(ThisSum<0)      /*如果当前子列和为负*/

           ThisSum=0;        /*则不可能使后面的部分和增大,抛弃之*/

}

return MaxSum;

}

时间复杂度O(N),Greate!!!!

来自《数据结构》浙江大学 陈越

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值