关于计算最大子序列的四种方法
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;
}
最后一种算法不仅短小精悍,而且效率很高。。。继续努力吧。
//一共四种算法,算法一时间复杂度为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;
}
最后一种算法不仅短小精悍,而且效率很高。。。继续努力吧。
相关文章推荐
- SQL计算字符串中最大的递增子序列的方法
- 求最大子序列和的四种经典方法及其算法时间复杂度分析
- 求最大子序列和及其位置(四种经典方法)
- 求最大子序列和的四种方法
- 最大连续子序列的四种求解方法
- 求最大子序列之和的四种方法
- 计算 数的四种方法-2
- 文本比较算法Ⅵ——用线性空间计算最大公共子序列(翻译贴)
- 关于JOJ 2042的启发——一种写程序计算幂函数的方法
- C# 中使用 MD5 算法计算 hash (哈希)值的四种方法
- 关于闰年的由来和计算方法
- 同时获得一个序列的最小和最大值的方法
- 关于性能测试中一些计算方法(throughput, active user...)
- [转]关于日期天数计算的几种方法
- 计算最大连续子序列之和
- 计算数组中最大值、最小值和平均值的方法(The methods of calculating the maximum, minimum and average of a array )
- 关于A类,B类,C类IP地址的网段和主机数的计算方法
- 最简练的计算三个整数中最大值和最小值的方法
- 关于个人所得税的计算方法及税率
- 关于as3显示对象的深度计算方法