考研复习 | 数据结构 / 斐波那契数列复杂度
斐波那契数学表达式
F ( n ) = { 1 n = 0 , 1 F ( n − 1 ) + F ( n − 2 ) n > 1 F(n)=\left\{ \begin{array}{l} 1 & & {n=0,1}\\ F(n-1)+F(n-2) & & {n>1} \end{array} \right. F(n)={1F(n−1)+F(n−2)n=0,1n>1
递归方法
C++代码
int recursion(int n) {
int result;
if (n <= 1)
result = 1;
else
result = recursion(n-1) + recursion(n-2);
return result;
}
时间复杂度
关于斐波那契递归方法的时间复杂度我看了两篇文章, 也是网上主要的两种答案
- O ( 2 n ) O(2^n) O(2n)
参考这篇博客 提到的, 以二叉树展开斐波那契数列, 那么时间复杂度就是节点个数 2 n 2^n 2n , 但是有个问题就是, 其实这个不是满二叉树, 所以有了第二个答案.
循环方法
C++ 代码
int cycle(int n) {
int result;
if (n <= 1) {
result = 1;
}
else {
int i, a, b;
a = 1;
b = 1;
for(i = 2; i <= n; i++) {
result = a + b;
b = result;
a = result - a;
}
}
return result;
}
时间复杂度
- O ( ( 1 + 5 2 ) n ) O((\frac{1+\sqrt5}{2})^n) O((21+5)n)
这个答案参考知乎用户SleepyBag 的推导, 由于能力有限, 刚开始复习, 只能勉强看懂第一种方法. 两种方法都是证得
T
(
n
)
∈
O
(
F
(
n
)
)
T(n) \in O(F(n))
T(n)∈O(F(n))
其中
T
(
n
)
T(n)
T(n) 为时间复杂度,
F
(
n
)
F(n)
F(n) 为斐波那契数列通项公式.
斐波那契通项公式相关推导 得到数列中第
n
n
n 个数为:
a
n
=
1
5
[
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
]
a_n=\frac{1}{\sqrt5}\left[\left(\frac{1+\sqrt5}{2}\right)^n-\left(\frac{1-\sqrt5}{2}\right)^n\right]
an=51[(21+5)n−(21−5)n]