我有一个我正在尝试实现的算法。我被要求确定一个描述最坏情况下运行时间的函数。作为输入,它需要一些长度的数组(让我们称之为n)。那么它的作用如下:
if (n==0){ return 0;}
else if(n==1){return A[0];}
else{
return f(n-1)+f(n-2)
}
很抱歉,如果我对实现细节有点稀疏,但从某种意义上说,它与fibbanoci序列非常类似。我认为这个算法的最坏情况运行时间是t(n)= 2 ^ n,因为如果n很大,它将分解为2个单独的计算,而这又将分成2个,依此类推。我只是不确定如何正式证明这个
答案 0 :(得分:5)
让我们首先得到一个运行时间的递归。
T(0) = T(1) = 1
因为两者都只返回一个数字(一个是数组查找,但这也是常量时间)。对于n > 1
我们有
T(n) = T(n-1) + T(n-2) + 1
因为您评估了f(n-1)
和f(n-2)
并添加了两个结果。这与Fibonacci序列本身几乎相同,F(n) = F(n-1) + F(n-2)
,结果密切相关。
n | T(n) | F(n)
----------------
0 | 1 | 0
1 | 1 | 1
2 | 3 | 1
3 | 5 | 2
4 | 9 | 3
5 | 15 | 5
6 | 25 | 8
7 | 41 | 13
8 | 67 | 21
9 | 109 | 34
10 | 177 | 55
11 | 287 | 89
如果查看这些值,就会看到
T(n) = F(n+2) + F(n-1) - 1
并且可以通过归纳证明,如果你需要。
由于Fibonacci序列的术语由F(n) = (φ^n - (1-φ)^n)/√5
给出,其中φ = (1 + √5)/2
,f
的复杂性也是Θ(φ^n)
,如同斐波那契序列。这比Θ(2^n)
更好,但仍然是指数级的,因此使用这种方式计算仅适用于小n
。