分治法(算法导论Lec3)

包括一个数的n次方O(lgn),矩阵相乘,矩阵的n次方,斐波纳契的各种方法(运行时间指数,O(n), O(lgn) )

 

/**
 * @brief Divide and Conquer, Algorithm lecture3 
 * @author An
 * @data  2013.5.14                                                                  
**/

//一个数的n次方, 运行时间为O(lgn)。
double power ( double value, int n )
{
	if ( n == 0 )
		return 1;
	if ( n == 1 )
		return value;
	if ( n % 2 == 0 )
		return power( value, n / 2 ) * power( value, n / 2 );
	if ( n % 2 != 0 )
		return power( value, (n - 1) / 2 ) * power( value, (n -1) / 2) * value;
}

//multiply two matrix O(n^3)
long** MatrixMultiply ( long **MA, long **MB, int n)
{
	long **MC = new long *[n];
 	for ( int i = 0; i < n; ++ i )
		MC[i] = new long[n];

	for ( int i = 0; i < n; ++i )
		for ( int j = 0; j < n; ++j )
			MC[i][j] = 0;

	for ( int i = 0; i < n; ++i )
		for ( int j = 0; j < n; ++j )
			for ( int k = 0; k < n; ++k )
				MC[i][j] += MA[i][k] * MB[k][j];
	
	return MC;
}

//multiply n matrix O((m^3)lgn)?, here m == 2
long** MatrixPower ( long **MA, int n )
{
	if ( n == 1 )
		return MA;
	if ( n % 2 == 0 )
		return MatrixMultiply( MatrixPower( MA, n/2), MatrixPower( MA, n/2 ), 2 );
	if ( n % 2 != 0 )
		return MatrixMultiply( MatrixMultiply( MatrixPower( MA, (n-1)/2), MatrixPower( MA, (n-1)/2 ), 2 ), MA, 2 );
}

//Fibonacci numbers, 运行时间指数。
long FibonacciRecurrence ( int n )
{
	if ( n == 0 )
		return 0;
	if ( n == 1 )
		return 1;
	if ( n > 1 )
		return FibonacciRecurrence( n - 2 ) + FibonacciRecurrence( n - 1 );
}

//Fibonacci numbers, 运行时间O(n)
long FibonacciBottomUp ( int n )
{
	long *res = new long[n + 1];
	res[0] = 0;
	res[1] = 1;
	for ( int i = 2; i <= n; ++ i )
		res[i] = res[i - 2] + res[i - 1];
	long result = res[n];
	delete [] res;
	return result;
}

//Fibonacci numbers, 运行时间O(lgn)
long FibonacciMatrix ( int n )
{
	long matrix[2][2] = { 1, 1, 1, 0 };
	long **M = new long *[2];
	for ( int i = 0; i < 2; ++i )
		M[i] = new long[2];
	for ( int i = 0; i < 2; ++i )
		for ( int j = 0; j < 2; ++j )
			M[i][j] = matrix[i][j];
	M = MatrixPower( M, n );
	long result = M[0][1];
	for ( int i = 0; i < 2; ++i )
		delete [] M[i];
	delete [] M;
	return result;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值