您的位置:首页 > 其它

关于计算最大子序列的四种方法

2014-09-18 21:52 351 查看
亮瞎眼啊。还是努力学吧。

//一共四种算法,算法一时间复杂度为O(N^3),二为O(N^2),三为O(NlogN),四为O(N)

//The first Algorithm
int MaxSubsequenceSum ( const int A[ ], int N )
{
int ThisSum, MaxSum, i, j, k;

MaxSum = 0;
for( i = 0; i < N;i++ )
for( j = 1; j < N; j++ )
{
ThisSum =0;
for( k = i; k <= j; k++ )
ThisSum += A[ k ];

if(ThisSum > MaxSum )
MaxSum = ThisSum;
}
return MaxSum;
}

//The second Algorithm
int MaxSubSequenceSum( const int A[ ], int N )
{
int ThisSum, MaxSum, i, j;
MaxSum = 0;
for( i = 0; i < N; i++ )
{
ThisSum = 0;
for( j = i; j < N; j++)
{
ThisSum += A[ j ];

if(ThisSum > MaxSum )
MaxSum = ThisSum;
}
}
return MaxSum;
}

//The third Algorithm
static int MaxSubSum(const int A[ ], int Left, int Right )
{
int MaxLeftSum,MaxRightSum;
int MaxLeftBorderSum, MaxRightBorderSum;
int LeftBorderSum, RightBorderSum;
int Center, i;

if( Left == Right ) //base case
if( A[ Left ] > 0)
return A[ Left ];
else
return 0;

Center = ( Left + Right ) / 2;
MaxLeftSum = MaxSubSum( A, Left,Center );
MaxRightSum = MaxSubSum( A, Center+1, Right );

MaxLeftBorderSum = 0;LeftBorderSum = 0;
for( i = Center; i >=Left; i-- )
{
LeftBorderSum += A[ i ];
if( LeftBorderSum > MaxLeftBorderSum )
MaxLeftBorderSum = LeftBorderSum;
}

MaxRightBorderSum = 0;RightBorderSum = 0;
for( i = Center + 1; i <= Right; i++ )
{
RightBorderSum += A[ i ];
if( RightBorderSum > MaxRightBorderSum )
MaxRightBorderSum = RightBorderSum;

}

return Max3( MaxLeftSum, MaxRightSum,MaxLeftBorderSum + MaxRightBorderSum);
}

int MaxSubsequenceSum( const int A[ ],int N )
{
return MaxSubSum( A, 0, N-1);
}

//The forth Algorithm
int MaxSubsequenceSum( const int A[ ], int N )
{
int ThisSum, MaxSum, j;

ThisSum = MaxSum = 0;
for( j = 0; j < N; j++ )
{
ThisSum += A[ j ];

if( ThisSum > MaxSum )
MaxSum = ThisSum;
else if ( ThisSum < 0 )
ThisSum = 0;
}
return MaxSum;
}

最后一种算法不仅短小精悍,而且效率很高。。。继续努力吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: