java实现最长连续子序列_java 之连续子序列最大和问题的四个解法

import java.util.Random;

public final class MaxSumTest

{

static private int seqStart = 0;

static private int seqEnd = -1;

/**

*ustczyy

*zyyjiao@mail.ustc.edu.cn

*/

public static int maxSubSum1( int [ ] a )

{

int maxSum = 0;

for( int i = 0; i < a.length; i++ )

for( int j = i; j < a.length; j++ )

{

int thisSum = 0;

for( int k = i; k <= j; k++ )

thisSum += a[ k ];

if( thisSum > maxSum )

{

maxSum = thisSum;

seqStart = i;

seqEnd = j;

}

}

return maxSum;

}

/**

*ustczyy

*zyyjiao@mail.ustc.edu.cn

*/

public static int maxSubSum2( int [ ] a )

{

int maxSum = 0;

for( int i = 0; i < a.length; i++ )

{

int thisSum = 0;

for( int j = i; j < a.length; j++ )

{

thisSum += a[ j ];

if( thisSum > maxSum )

{

maxSum = thisSum;

seqStart = i;

seqEnd = j;

}

}

}

return maxSum;

}

/**

*ustczyy

*zyyjiao@mail.ustc.edu.cn

*/

public static int maxSubSum3( int [ ] a )

{

int maxSum = 0;

int thisSum = 0;

for( int i = 0, j = 0; j < a.length; j++ )

{

thisSum += a[ j ];

if( thisSum > maxSum )

{

maxSum = thisSum;

seqStart = i;

seqEnd = j;

}

else if( thisSum < 0 )

{

i = j + 1;

thisSum = 0;

}

}

return maxSum;

}

/**

* *ustczyy

*zyyjiao@mail.ustc.edu.cn

*/

private static int maxSumRec( int [ ] a, int left, int right )

{

int maxLeftBorderSum = 0, maxRightBorderSum = 0;

int leftBorderSum = 0, rightBorderSum = 0;

int center = ( left + right ) / 2;

if( left == right ) // Base case

return a[ left ] > 0 ? a[ left ] : 0;

int maxLeftSum = maxSumRec( a, left, center );

int maxRightSum = maxSumRec( a, center + 1, right );

for( int i = center; i >= left; i-- )

{

leftBorderSum += a[ i ];

if( leftBorderSum > maxLeftBorderSum )

maxLeftBorderSum = leftBorderSum;

}

for( int i = center + 1; i <= right; i++ )

{

rightBorderSum += a[ i ];

if( rightBorderSum > maxRightBorderSum )

maxRightBorderSum = rightBorderSum;

}

return max3( maxLeftSum, maxRightSum,

maxLeftBorderSum + maxRightBorderSum );

}

/**

* Return maximum of three integers.

*/

private static int max3( int a, int b, int c )

{

return a > b ? a > c ? a : c : b > c ? b : c;

}

/**

* ustczyy

*zyyjiao@mail.ustc.edu.cn

*/

public static int maxSubSum4( int [ ] a )

{

return a.length > 0 ? maxSumRec( a, 0, a.length - 1 ) : 0;

}

public static void getTimingInfo( int n, int alg )

{

int [] test = new int[ n ];

long startTime = System.currentTimeMillis( );;

long totalTime = 0;

int i;

for( i = 0; totalTime < 4000; i++ )

{

for( int j = 0; j < test.length; j++ )

test[ j ] = rand.nextInt( 100 ) - 50;

switch( alg )

{

case 1:

maxSubSum1( test );

break;

case 2:

maxSubSum2( test );

break;

case 3:

maxSubSum3( test );

break;

case 4:

maxSubSum4( test );

break;

}

totalTime = System.currentTimeMillis( ) - startTime;

}

System.out.println( "Algorithm #" + alg + "\t"

+ "N = " + test.length

+ "\ttime = " + ( totalTime * 1000 / i ) + " microsec" );

}

private static Random rand = new Random( );

/**

* Simple test program.

*/

public static void main( String [ ] args )

{

int a[ ] = { 4, -3, 5, -2, -1, 2, 6, -2 };

int maxSum;

maxSum = maxSubSum1( a );

System.out.println( "Max sum is " + maxSum + "; it goes"

+ " from " + seqStart + " to " + seqEnd );

maxSum = maxSubSum2( a );

System.out.println( "Max sum is " + maxSum + "; it goes"

+ " from " + seqStart + " to " + seqEnd );

maxSum = maxSubSum3( a );

System.out.println( "Max sum is " + maxSum + "; it goes"

+ " from " + seqStart + " to " + seqEnd );

maxSum = maxSubSum4( a );

System.out.println( "Max sum is " + maxSum );

// Get some timing info

for( int n = 10; n <= 1000000; n *= 10 )

for( int alg = 4; alg >= 1; alg-- )

{

if( alg == 1 && n > 50000 )

continue;

getTimingInfo( n, alg );

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值