美文网首页
求最大子列和问题 优化算法

求最大子列和问题 优化算法

作者: 周末的游戏之旅 | 来源:发表于2019-08-01 09:38 被阅读0次

    先看一下前面的传统算法:

    intMaxSubseqSum1(intA[],intN){
        intThisSum,MaxSum=0;
        inti,j,k;
        for(i=0;i<N;i++){/*i是子列左端位置*/
            for(j=i;j<N;j++){/*j是子列右端位置*/
                ThisSum=0;/*ThisSum是从A[i]到A[j]的子列和*/
                for(l=i;k<=j;k++)
                    ThisSum+=A[k];
                    if(ThisSum>MaxSum)/*如果刚得到的这个子列和更大*/
                    MaxSum=ThisSum;/*则更新结果*/
            }/*j循环结束*/
        }/*i循环结束*/
        returnMaxSum;
    }
    

    时间复杂度为:T(N)=O(N^3),显然该算法虽然简单易懂,但是时间复杂度太高。

    分析一下这个算法,前三项的连续子列为

    a1;

    a1+a2;

    a1+a2+a3;

    第三次相加的时候重复了第二次的a2+a3的操作,然而仅仅需要再第二次的基础上加a3即可,这样就减少了一层的for循环,时间复杂度为T(N)=O(N^2),效率大大提高;
    代码如下:

    int Ma`xSunseqSum2(int A[],int N){
        int ThisSum,MaxSum=0;
        int i,j;
        for(i=0;i<N;i++){/*i是子列左端位置*/
            ThisSum=0;/*ThisSum是从A[i]到A[j]的子列和*/
            for(j=i;j<N;j++){/*j是子列右端位置*/   
                ThisSum+=A[j];
                /*对于相同的i,不同的j,只要在j-1次循环的基础上累加1项即可*/
                if(ThisSum>MaxSum)/*如果刚得到的这个子列和更大*/
                    MaxSum=ThisSum;/*则更新结果*/
            }/*j循环结束*/
        }/*i循环结束*/
        return MaxSum;
    }
    

    相关文章

      网友评论

          本文标题:求最大子列和问题 优化算法

          本文链接:https://www.haomeiwen.com/subject/nywfdctx.html