学习笔记:数据结构、算法::求最大子列和

来源:互联网 发布:程序员到架构师 编辑:程序博客网 时间:2024/05/16 12:48

学习笔记:数据结构、算法::求最大子列和

一、一般算法

int MaxSum(int a[],int n){    int maxsum=0,thissum=0;    for(int i=0;i<n;i++){//子列左端        for(int j=i;j<n;j++){//子列右端            thissum=0;            for(int k=i;k<j;k++){//求子列和                thissum+=a[k];            }            if(thissum>maxsum){//判断            maxsum=thissum;            }        }    }}

时间复杂度为O(n^3);

二、简单优化算法

int MaxSum(int a[],int n){    int maxsum=0,thissum;    for(int i=0;i<n;i++)for(int j=i;j<n;j++){//子列左端        thissum=0;        for(int j=i;j<n;j++){//子列右端            thissum+=a[j];            if(thissum>maxsum){//判断                maxsum=thissum;            }        }     }

在取子列右端时便计算子列和,少了一层计算子列和的循环;
时间复杂度为O(n^2);

三、分治算法

#include <iostream>#include <math.h>using namespace std;int tmax(int,int,int);int maxsum(int[],int,int);int leftmaxsum(int[],int,int);int rightmaxsum(int[],int,int);int main(){    int n;    cin>>n;    int *a=new int[n-1];    for(int i=0;i<n;i++){        cin>>a[i];    }    //int a[8]={4,-3,5,-2,-1,2,5,-3};    cout<<maxsum(a,0,n);     delete[] a;    return 0;}int tmax(int a,int b,int c){    int m;    if(a>b){m=a;}    else{m=b;};    if(m>c){return m;}    else{return c;}}int maxsum(int a[],int left,int right){    int smax,mid,leftmax,rightmax,midmaxsum;    if(left==right){        return a[left];    }    mid=(right+left)/2;    leftmax=maxsum(a,left,mid);    rightmax=maxsum(a,mid+1,right);    smax=max(leftmax,rightmax);    midmaxsum=leftmaxsum(a,left,mid)+rightmaxsum(a,mid+1,right);    //return tmax(leftmax,rightmax,midmaxsum);    return max(smax,midmaxsum);}int leftmaxsum(int a[],int left,int mid){    int maxsum=a[mid],sum=0;    for(int i=mid;i>=left;i--){        sum+=a[i];        if(sum>maxsum){maxsum=sum;        }    }    return maxsum;}int rightmaxsum(int a[],int mid,int right){    int maxsum=a[mid],sum=0;    for(int i=mid;i<=right;i++){        sum+=a[i];        if(sum>maxsum){maxsum=sum;        }    }    return maxsum;}

时间复杂度:
T(n)=2T(n/2)+c*n,T(1)=O(1);
递推得到 T(n)=2^k*O(1)+c*k*n,k=log2(n);
时间复杂为O(n*logn);

三、在线处理
在线的意思是指每输入一个数据就进行处理 ,在任何一个地方终止输入,算法都能能正确给出当前解。

int MaxSum(int a[],int n){    int maxsum=0,thissum=0;    for(int i=0;i<n;i++){        thissum+=a[i];        if(thissum>maxsum){            maxsum=thissum;        }        if(thissum<0){            thissum=0;        }    }    return maxsum;}

时间复杂度:O(n);