算法2:最大子序列和问题

四种方法得到最大子序列和:
maxsum_brutalforce: 穷举 O(n3)
maxsum_brutalforce_m: 优化穷举 O(n2)
maxsum_dc: divide and conquer O(nlog(n))
maxsum_l: 线性算法 O(n)

#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
#include <ctime>

using namespace std;

int maxsum_brutalforce(const vector<int> & a)
{
    int temp_sum=0, sum=0;
    for(unsigned int i=0; i<a.size(); i++)
        for(unsigned int j=i; j<a.size(); j++)
        {
            temp_sum=0;
            for(unsigned int k=i; k<=j; k++)
            {
                temp_sum += a[k];

            }
            if(temp_sum>sum)sum=temp_sum;
        }

    return sum;
}

int maxsum_brutalforce_m(const vector<int> & a)
{
    int temp_sum=0, sum=0;
    for(unsigned int i=0; i<a.size(); i++)
    {
        temp_sum=0;
        for(unsigned int k=i; k<a.size(); k++)
        {
            temp_sum += a[k];
            if(temp_sum>sum)sum=temp_sum;
        }
    }

    return sum;
}

int maxsum_cross(const vector<int> & a, int start, int end)
{
    int temp_sum1=0, sum=0;

    int middle = (start+end)/2;

    for(int i=middle; i>=start; i--)
    {
        temp_sum1 += a[i];
        if(temp_sum1>sum)sum=temp_sum1;
    }
    temp_sum1=sum;
    int temp_sum2=0; sum=0;

    for(int i=middle+1; i<=end; i++)
    {
        temp_sum2 += a[i];
        if(temp_sum2>sum)sum=temp_sum2;
    }
    temp_sum2=sum;
    return (temp_sum1+temp_sum2);
}

int maxsum_dc(const vector<int> & a, int start, int end)
{
    if(start==end)
        return a[start];

    int middle = (start+end)/2;

    int sum1 = maxsum_dc(a, start, middle);
    int sum2 = maxsum_dc(a, middle+1, end);
    int sum3 = maxsum_cross(a, start, end);

    sum2 = (sum2>sum3)? sum2:sum3;
    sum1 = (sum2>sum1)? sum2:sum1;

    return sum1;
}

int maxsum_l(const vector<int> & a)
{
    int temp_sum=0, sum=0;
    for(unsigned int i=0; i<a.size(); i++)
    {

        temp_sum += a[i];

        if(temp_sum<0){
            temp_sum=0;
            continue;
        }

        if(temp_sum>sum)
            sum=temp_sum;
    }

    return sum;
}

int main()
{
    vector<int> a; 

    srand (time(NULL));

    for(unsigned int i=0; i<1000; i++){
        a.push_back( rand()%10 -3 );
        cout<<a[i]<<" ";
    }

    clock_t t;

    t = clock();
    cout<<maxsum_brutalforce(a)<<endl;
    t = clock() - t;
    cout<<((float)t)/CLOCKS_PER_SEC<<endl;

    t = clock();
    cout<<maxsum_brutalforce_m(a)<<endl;
    t = clock() - t;
    cout<<((float)t)/CLOCKS_PER_SEC<<endl;

    t = clock();
    cout<<maxsum_dc(a,0, a.size()-1)<<endl;
    t = clock() - t;
    cout<<((float)t)/CLOCKS_PER_SEC<<endl;

    t = clock();
    cout<<maxsum_l(a)<<endl;
    t = clock() - t;
    cout<<((float)t)/CLOCKS_PER_SEC<<endl;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值