包括一个数的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;
}