最大子序列问题,递归和线性

来源:互联网 发布:知乎亡羊补牢为时未晚 编辑:程序博客网 时间:2024/05/02 01:09
/*************************************************************************    > File Name: maxSumRec.cpp    > Author:keson    > Mail:keson@bupt.edu.cn    > Created Time: 2014年11月20日 星期四 17时51分23秒 ************************************************************************/#include<stdio.h>#include<iostream>#include<vector>#include<algorithm>#include<ctime>using namespace std;const int SIZE=50000000;int maxSumRec(const vector<int> &a,int left,int right){    if (left==right)  //Base case    {        if (a[left]>0)          return a[left];        else          return 0;    }    int center=(left+right)/2;    int maxLeftSum=maxSumRec(a,left,center);    int maxRightSum=maxSumRec(a,center+1,right);    int maxLeftBorderSum=0,leftBorderSum=0;    for(int i=center;i>=left;--i)    {        leftBorderSum+=a[i];        if(leftBorderSum>maxLeftBorderSum)           maxLeftBorderSum=leftBorderSum;    }    int maxRightBorderSum=0,rightBorderSum=0;    for(int i=center+1;i<=right;++i)    {        rightBorderSum+=a[i];        if(rightBorderSum>maxRightBorderSum)           maxRightBorderSum=rightBorderSum;    }    return max(max(maxLeftSum,maxRightSum),maxLeftBorderSum+maxRightBorderSum);}int maxSubSum(const vector<int> &a){    int maxSum=0,thisSum=0;    for(int i=0;i<a.size();++i)    {        thisSum+=a[i];        if (thisSum>maxSum)          maxSum=thisSum;        if(thisSum<=0)          thisSum=0;    }    return maxSum;}int main(){    vector<int> vec={};    for(int i=1;i<=SIZE;++i)    {        vec.push_back(rand()%100-50);    }       clock_t start_time=clock();   cout<< maxSumRec(vec,0,vec.size()-1)<<endl;   clock_t end_time=clock();   cout<<"Running time is:"<<   static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC<<" S"<<endl;    clock_t start_time2=clock();    cout<<maxSubSum(vec)<<endl;    clock_t end_time2=clock();    cout<<"Running time is: "<<    static_cast<double>(end_time2-start_time2)/CLOCKS_PER_SEC<<" S"<<endl;    return 0;}


0 0
原创粉丝点击