zoukankan      html  css  js  c++  java
  • 最大子序列和问题的四种算法

    算法一,该算法的复杂度为:O(N^3)

    int MaxSubsequenceSum( const int A[],int N)
    {
    	int ThisSum,Maxsum,i,j,k;
        MaxSum = 0;
        for(i = 0; i < N; i++)
        	for(j = i; j < N; j++)
            {
            	ThisSum = 0;
                for(k = i; k <= j; k++)
                	ThisSum += A[k];
                if(ThisSum > MaxSum)
                	MaxSum = ThisSum;
            }
        return MaxSum;
    }
    

    算法二,该算法的复杂度为:O(N^2)

    int MaxSubsequenceSum( const int A[],int N)
    {
    	int ThisSum,MaxSum,i,j;
        MaxSum = 0;
        for( i = 0; i < N; i++)
        {
        	ThisSum = 0;
            for(j = i; j < N;j++)
            {
            	ThisSum += A[j];
                if(ThisSum > MaxSum)
                	MaxSum = ThisSum;
            }
        }
        return MaxSum;
    }
    

    算法三,该算法的复杂度为:O(NlogN)

    static int MaxSubSum(const int A[],int Left,int Right)
    {
    	int MaxLeftSum,MaxRightSum;
        int MaxLeftBorderSum,MaxRightBorderSum;
        int LeftBorderSum,RightBorderSum;
        int Center,i;
        
        if (Left == Right) /* Base Case */
        	if (A[Left] > 0)
            	return A[Left];
            else
            	return 0;
        Center = (Left + Right)/2;
        MaxLeftSum = MaxSubSum(A,Left,Center);
        MaxRightSum = MaxSubSum(A,Center+1,Right);
       
        MaxLeftBorderSum = 0;
        LeftBorderSum = 0;
        for(i = Center; i >= Left; i--)
        {
       	   LeftBorderSum += A[i];
              if(LeftBorderSum > MaxLeftBorderSum)
            	MaxLeftBorderSum = LeftBorderSum;
        }
       
        MaxRightBorderSum = 0;
        RightBorderSum = 0;
        for(i = Center + 1; i <= Right; i++)
        {
       	  RightBorderSum += A[i];
             if(RightBorderSum > MaxRightBorderSum)
            	MaxRightBorderSum = RightBorderSum;
       }
       
       return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum + MaxRightBorderSum);
    }
    int MaxSubsequenceSum(const int A[],int N)
    {
    	return MaxSubSum(A,0,N-1);
    }
    

    算法四,该算法的复杂度为:O(N)

    int MaxSubsequenceSum(const int A[],int N)
    {
    	int ThisSum,MaxSum,j;
        ThisSum = MaxSum = 0;
        for(j =0; j < N; j++)
        {
        	ThisSum += A[j];
            if(ThisSum > MaxSum)
            	MaxSum = ThisSum;
            else if(ThisSum < 0)
            	ThisSum = 0;
        }
        return MaxSum;
    }
  • 相关阅读:
    文件分段后,进行分片上传逻辑
    总结几个最近处理问题中使用http协议的代码
    openresty(nginx)中使用lua脚本获取请求IP地址的代码
    线上Storm的worker,executor,task参数调优篇
    async/await
    DataTables.Queryable Sample
    关闭 XXXXX 前你必须关闭所有会话框
    关于P/Invoke的闲话
    Windows 2008 Scheduled tasks result codes
    MySQL 8.0.13的使用心得
  • 原文地址:https://www.cnblogs.com/y3w3l/p/6349365.html
Copyright © 2011-2022 走看看