chapter 2 Algorithm Analysis

本文介绍了四种不同的算法来解决最大子数组和问题,包括穷举法、简化穷举法、分治法及改进的线性时间复杂度算法。通过对比不同算法的时间复杂度,展示了从O(n^3)到O(n)的优化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	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;		
			}
		return maxSum;
	}
	

Figure 2.5 Algorithm 1

	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;
			}
			

		}
		return maxSum;
	}

Figure 2.6 Algorithm 2

public class maxSubSum {

	private static int maxSumRec( int [ ] a, int left, int right )
	{
		if( left == right ) // Base case
			if( a[ left ] > 0 )
				return a[ left ];
			else
				return 0;
		
		int center = ( left + right ) / 2;
		int maxLeftSum = maxSumRec( a, left, center );
		int maxRightSum = maxSumRec( a, center + 1, right );
		
		int maxLeftBorderSum = 0, leftBorderSum = 0;
		for( int i = center; i >= left; i-- )
		{
			leftBorderSum += a[ i ];
			if( leftBorderSum > maxLeftBorderSum )
				maxLeftBorderSum = leftBorderSum;
		}
		
		int maxRightBorderSum = 0, rightBorderSum = 0;
		for( int i = center + 1; i <= right; i++ )
		{
			rightBorderSum += a[ i ];
			if( rightBorderSum > maxRightBorderSum ) 
				maxRightBorderSum = rightBorderSum;
		}
		
		return max3( maxLeftSum, maxRightSum, 
				maxLeftBorderSum + maxRightBorderSum );
	}
	
	private static int max3( int a, int b, int c )
	{
		return a >= b ? ( a >= c ? a : c ) : ( b >= c ? b : c );
	}
	
	public static int maxSubSum3( int [] a )
	{
		return maxSumRec( a, 0, a.length - 1 );
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = {4, -3, 5, -2, -1, 2, 6, -2};
		System.out.println(maxSubSum3(a));
	}

}

Figure 2.7 Algorithm 3

public class MaxSubSum4 {

	public static int maxSubSum4( int [ ] a )
	{
		int maxSum = 0, thisSum = 0;
		
		for( int j = 0; j <	a.length; j++)
		{
			thisSum += a[ j ];
			
			if( thisSum > maxSum )
				maxSum = thisSum;
			else if( thisSum < 0 )
				thisSum = 0;
		}
		return maxSum;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = { 4, -3, 5, -2, -1, 2, 6, -2};
		System.out.println(maxSubSum4(a));
	}

}

Figure 2.8 Algorithm 4

public class BinarySearch {
	
	public static <AnyType extends Comparable<? super AnyType>>
	int binarySearch( AnyType [ ] a, AnyType x )
	{
		int low = 0, high = a.length;
		
		while( low <= high )
		{
			int mid = ( low + high ) / 2;
			
			if( a[ mid ].compareTo( x ) < 0 )
				low = mid + 1;
			else if ( a[ mid ].compareTo( x ) > 0 )
				high = mid - 1;
			else
				return mid;
		}
		
		return -1; // NOT_FOUND is defined as -1
	}

	public static long gcd( long m, long n )
	{
		if( m < n )
		{
			long temp = m;
			m = n;
			n = temp;
		}
		
		while( n != 0  )
		{
			long rem = m % n;
			m = n;
			n = rem;
		}
		return m;	
	}
	
	public static long pow( long x, int n)
	{
		if ( n == 0 )
			return 1;
		else if( n % 2 == 0 )
			return pow( x * x, n / 2 );
		else
			return pow( x, n - 1 ) * x;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer [] a = {1,2,3,4,5};
		System.out.println( binarySearch( a, 5 ) );
		System.out.println( gcd( 50, 15 ) );
		System.out.println( pow( 50, 5 ) );
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值