四种方法得到最大子序列和:
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;
}