Fibonacci数列求解
fib(n)={nn⩽1fib(n−1)+fib(n−2)n⩾2 fib(n)=\left\{\begin{array}{l}{n} &n\leqslant1\\ {fib(n-1)+fib(n-2)}&n\geqslant2\end{array}\right. fib(n)={nfib(n−1)+fib(n−2)n⩽1n⩾2
1. 二分递归,时间复杂度:O(2n)O(2^n)O(2n)
int fib(int n){
return (2 > n) ? n : fib(n - 1) + fib(n - 2);
}
花费时间为T(n)T(n)T(n),递推公式如下:
T(n)={nn⩽1T(n−1)+T(n−2)n⩾2
T(n)=\left\{\begin{array}{l}{n} &n\leqslant1\\ {T(n-1)+T(n-2)}&n\geqslant2\end{array}\right.
T(n)={nT(n−1)+T(n−2)n⩽1n⩾2
根据特征方程方法来求解:
对于数列an+2=c1an+1+c2ana_{n+2}=c_{1} a_{n+1}+c_{2} a_{n}an+2=c1an+1+c2an可以构造特征方程x2=c1x+c2x^2=c_1 x+c_{2}x2=c1x+c2,方程解为x1,x2x_1,x_2x1,x2可以得到最终通项公式为:an=px1n+qx2na_{n}=p x_{1}^{n}+q x_{2}^{n}an=px1n+qx2n
那么Fibonacci数列可以得到
x1=1+52x2=1−52x_{1}=\frac{1+\sqrt{5}}{2} \quad x_{2}=\frac{1-\sqrt{5}}{2}x1=21+5x2=21−5
则有an=p(1+52)n+q(1−52)na_{n}=p\left(\frac{1+\sqrt{5}}{2}\right)^{n}+q\left(\frac{1-\sqrt{5}}{2}\right)^{n}an=p(21+5)n+q(21−5)n
代入a1=1,a2=1a_{1}=1, a_{2}=1a1=1,a2=1,可得p=15,q=−15p=\frac{1}{\sqrt{5}}, q=-\frac{1}{\sqrt{5}}p=51,q=−51
因此有:an=15[(1+52)n−(1−52)n]
a_{n}=\frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^{n}-\left(\frac{1-\sqrt{5}}{2}\right)^{n}\right]
an=51[(21+5)n−(21−5)n]
2. 线性递归,时间复杂度:O(n)O(n)O(n),空间复杂度O(n)O(n)O(n)
int fib(int n, int prev){
if (0 == n){
prev = 1;
return 0;
}
else{
int prevP; prev = fib(n-1, prevP);
return prevPrev + prev;
}
}
2. 迭代,时间复杂度:O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)
int fib(int n){
int f = 1, g = 0;
while(0 < n--){
g += f;
f = g-f;
}
return n
}
3. power2 方法,时间复杂度:O(logn)O(logn)O(logn)
(fib(n)fib(n+1))=(θ111)n(fib(θ)fib(1))=(0111)n(θ1)\left(\begin{array}{c}{f i b(n)} \\ {f_{i b}(n+1)}\end{array}\right)= \left(\begin{array}{ll}{\theta} & {1} \\ {1} & {1}\end{array}\right)^{n}\left(\begin{array}{l}{f_{i b}(\theta)} \\ {f_{i b}(1)}\end{array}\right)= \left(\begin{array}{ll}{0} & {1} \\ {1} & {1}\end{array}\right)^{n}\left(\begin{array}{l}{\theta} \\ {1}\end{array}\right)(fib(n)fib(n+1))=(θ111)n(fib(θ)fib(1))=(0111)n(θ1)
用矩阵的方法,将之前power2()
的平方改为矩阵的平方。