⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maxsum.cpp

📁 书上载的源码summax,求和的最大值
💻 CPP
字号:
#include <stdlib.h>#ifdef USE_DOT_H    #include <iostream.h>    #include <iomanip.h>#else    #include <iostream>    #include <iomanip>    #if !defined( __BORLANDC__ ) || __BORLANDC__ >= 0x0530        using namespace std;      // Borland has a bug    #endif#endif#ifndef SAFE_STL    #include <vector>    using std::vector;#else    #include "vector.h"    #include "StartConv.h"#endif// Cubic maximum contiguous subsequence sum algorithm.// Comparable: must have constructor from int, must have//     += and > defined, must have copy constructor//     and operator=, and must have all properties//     needed for vector.// seqStart and seqEnd represent the actual best sequence.template <class Comparable>Comparable maxSubsequenceSum1( const vector<Comparable> & a,                                int & seqStart, int & seqEnd ){    int n = a.size( );    Comparable maxSum = 0;    for( int i = 0; i < n; i++ )        for( int j = i; j < n; j++ )        {            Comparable thisSum = 0;            for( int k = i; k <= j; k++ )                thisSum += a[ k ];            if( thisSum > maxSum )            {                maxSum = thisSum;                seqStart = i;                seqEnd = j;            }        }    return maxSum;}// Quadratic maximum contiguous subsequence sum algorithm.// Comparable: must have constructor from int, must have//     += and > defined, must have copy constructor//     and operator=, and must have all properties//     needed for vector.// seqStart and seqEnd represent the actual best sequence.template <class Comparable>Comparable maxSubsequenceSum2( const vector<Comparable> & a,                               int & seqStart, int & seqEnd ){    int n = a.size( );    Comparable maxSum = 0;    for( int i = 0; i < n; i++ )    {        Comparable thisSum = 0;        for( int j = i; j < n; j++ )        {            thisSum += a[ j ];            if( thisSum > maxSum )            {                maxSum = thisSum;                seqStart = i;                seqEnd = j;            }        }    }    return maxSum;}template <class Comparable>Comparable max3( const Comparable & a, const Comparable & b, const Comparable & c ){	return a > b ? 		( a > c ? a : c  ) :		( b > c ? b : c );}// Recursive O( N log N ) maximum contiguous subsequence sum algorithm.// Comparable: must have constructor from int, must have//     += and > defined, must have copy constructor//     and operator=, and must have all properties//     needed for vector.template <class Comparable>Comparable maxSubSum( const vector<Comparable> & a, int left, int right ){    Comparable maxLeftBorderSum = 0, maxRightBorderSum = 0;    Comparable leftBorderSum = 0, rightBorderSum = 0;    int center = ( left + right ) / 2;    if( left == right ) 	// Base Case.        return a[ left ] > 0 ? a[ left ] : 0;    Comparable maxLeftSum  = maxSubSum( a, left, center );    Comparable maxRightSum = maxSubSum( a, center + 1, right );    for( int i = center; i >= left; i-- )    {        leftBorderSum += a[ i ];        if( leftBorderSum > maxLeftBorderSum )            maxLeftBorderSum = leftBorderSum;    }    for( int j = center + 1; j <= right; j++ )    {        rightBorderSum += a[ j ];        if( rightBorderSum > maxRightBorderSum )            maxRightBorderSum = rightBorderSum;    }    return max3( maxLeftSum, maxRightSum,                 maxLeftBorderSum + maxRightBorderSum );}// Public driver.template <class Comparable>Comparable maxSubsequenceSum3( const vector<Comparable> & a ){    return a.size( ) > 0 ? maxSubSum( a, 0, a.size( ) - 1 ) : 0;}// Linear maximum contiguous subsequence sum algorithm.// Comparable: must have constructor from int, must have//     += and > defined, must have copy constructor//     and operator=, and must have all properties//     needed for vector.// seqStart and seqEnd represent the actual best sequence.template <class Comparable>Comparable maxSubsequenceSum4( const vector<Comparable> & a,                               int & seqStart, int & seqEnd ){    int n = a.size( );    Comparable thisSum = 0;    Comparable maxSum = 0;    for( int i = 0, j = 0; j < n; j++ )    {        thisSum += a[ j ];        if( thisSum > maxSum )        {            maxSum = thisSum;            seqStart = i;            seqEnd = j;        }        else if( thisSum < 0 )        {            i = j + 1;            thisSum = 0;        }    }    return maxSum;}#include <time.h>void getTimingInfo( int n, int alg ){    vector<int> test( n );    int ss = -1, se = -1;    clock_t startTime;    int totalTime = 0;    int i;    for( i = 0; totalTime < 02 * CLOCKS_PER_SEC; i++ )    {        for( int j = 0; j < test.size( ); j++ )            test[ j ] = rand( ) % 100 - 50;        startTime = clock( );        switch( alg )        {          case 1:            maxSubsequenceSum1( test, ss, se );            break;          case 2:            maxSubsequenceSum2( test, ss, se );            break;          case 3:            maxSubsequenceSum3( test );            break;          case 4:            maxSubsequenceSum4( test, ss, se );            break;        }        totalTime += clock( ) - startTime;     }    cout.setf( ios::fixed, ios::floatfield );    cout.precision( 6 );    double elapsed =  totalTime / CLOCKS_PER_SEC;    cout << "Algorithm #" << alg << "\t"         << "N = " << setw( 8 ) << test.size( )         << "\ttime = " << setw( 12 ) << ( elapsed / i ) << endl;}     // Test program.int main( void ){    const int ARRAY_SIZE = 100;    vector<int> test( ARRAY_SIZE );    int ss = -1, se = -1;    for( int i = 0; i < test.size( ); i++ )        test[ i ] = rand( ) % 100 - 50;    cout << maxSubsequenceSum4( test, ss, se ) << endl;    cout << "  (at position " << ss << " to " << se << ")" << endl;    cout << maxSubsequenceSum3( test ) << endl;    cout << maxSubsequenceSum2( test, ss, se ) << endl;    cout << "  (at position " << ss << " to " << se << ")" << endl;    cout << maxSubsequenceSum1( test, ss, se ) << endl;    cout << "  (at position " << ss << " to " << se << ")" << endl;      // Get some timing info    for( int n = 1; n <= 100000; n *= 10 )        for( int alg = 4; alg >= 1; alg-- )        {            if( alg == 1 && n > 50000 )                continue;            getTimingInfo( n, alg );        }    return 0;}#ifdef SAFE_STL    #include "EndConv.h"#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -