12. 快速求幂(题目047)
题目:
给定两个整数base和exp(非负整数),求base的exp次幂,要求O(lgN)的时间复杂度。
解答:
int FastPow(int base, int exp)
{
if (exp == 0)
return 1;
if (exp == 1)
return base;
int ret = FastPow(base * 2, exp / 2);
if (exp % 2 == 1)
return ret * base;
else
return ret;
}
13. 快速斐波那契数列
题目:
输出斐波那契数列的第n项。
解答:
方法1:
思路:用迭代方式,只保存当前数列中最后两项的值,避免了重复计算。时间复杂度O(N)。
int Fibonacci(int n)
{
int fib[2] = {0, 1};
if (n <2)
return fib[n];
int i;
for (i = 1; i < n; ++i)
{
int temp = fib[1];
fib[1] += fib[0];
fib[0] = temp;
}
return fib[1];
}
方法2(快速方法):
思路:将数列的迭代计算转成矩形计算
因此有
再利用快速求幂的方法,将时间复杂度降至O(logn),但常数项较大。
Matrix FastMatrixPow(Matrix m, int exp)
{
static const Matrix E={{{1, 0}, {0, 1}}};
if (exp == 0)
return E;
if (exp == 1)
return m;
Matrix ret = FastMatrixPow(MatrixProduct(m,m), exp / 2);
if (exp % 2 ==1)
return MatrixProduct(ret, m); /* 矩阵相乘,返回新的矩阵,代码省略 */
else
return ret;
}
int FastFibonacci(int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
Matrix m = {{{1, 1}, {1, 0}}};
m = FastMatrixPow(m, n);
return m.d[1][0];
}