斐波那契数列 - 时间复杂度

Fibonacci Sequence - Time Complexity

假设 n>1 时 fib(n)=fib(n-1)+fib(n-2) 并且假设 fib(0)=a, fib(1)=b (some a, b >0),以下哪项是正确的?

fib(n) is 

Select one or more:
a. O(n^2)
b. O(2^n)
c. O((1-sqrt 5)/2)^n)
d. O(n)
e. Answer depends on a and b.
f. O((1+sqrt 5)/2)^n)

求解斐波那契数列我得到了:

fib(n)= 1/(sqrt 5) ((1+sqrt 5)/2)^n - 1/(sqrt 5) ((1-sqrt 5)/2)^n

但是这种情况下的时间复杂度是多少?这是否意味着答案是 c 和 f?

从公式的封闭形式来看,1 / (sqrt 5) ((1 - sqrt 5) / 2)^n 项有极限 0,因为 n 增长到无穷大 (|(1 - sqrt 5) / 2| < 1)。因此我们可以忽略这个词。此外,由于在时间复杂度理论中我们不关心乘法常数,因此以下内容为真:

fib(n) = Θ(φ^n)

其中 φ = (1 + sqrt 5) / 2 a.k.a。 golden ratio constant.

所以它是一个指数函数,我们可以排除 a, d, e。我们可以排除 c,因为正如所说它有限制 0。但答案 b 也是正确的,因为 φ < 2O 表示上限。

最后正确答案是:

b, f

Θ(φ^n) 在 a=1 and b=1a=1 and b=2 时是正确的。 The value of φ depends on a and b.

对于计算 fib(n-1) 和 fib(n-2),如果我们递归计算它们,复杂度为 exponential,但如果我们保存最后两个值并使用它们,复杂度为 O(n) 而不是取决于 a 和 b。