函数Fn(n)的时间复杂度是递归调用Fn(1),Fn(2),Fn(3),...,Fn(n-1)来求解Fn(n)的时间复杂度。给出Fn(1)= 1作为基本条件。是O(n ^ n)还是更少。我认为它应该小于O(n ^ n),但我无法找到一种方法来获得这种递归的正确复杂性。
Fn(4)的递归树将是这样的
Fn(4)
/ | \
Fn(3) Fn(2) Fn(1)
/ \ /
Fn(2) Fn(1) Fn(1)
/
Fn(1)
答案 0 :(得分:4)
重复发生的情况如下:
T(1) = 1
T(n) = Σ T(i), from i = 1 to n-1
乍一看不是特别有用,是吗?因此,让我们将其分解为子问题,看看它们是什么样的:
T(5) = T(4) + T(3) + T(2) + T(1)
=> T(5) = T(4) + T(3) + T(2) + 1
// The sub problems
T(4) = T(3) + T(2) + 1
T(3) = T(2) + 1
T(2) = 1
现在让我们将其中一些子问题替换回原来的问题:
T(5) = T(4) + T(3) + T(2) + 1
=> T(5) = T(4) + T(4)
=> T(5) = 2T(4)
因此我们可以推断出复发真的如下:
T(n) = 2T(n-1)
T(n-1) = 2T(n-2)
所以我们可以将我们的重复重写为
T(n) = 2[ 2T(n-2) ]
T(n) = 2[ 2 [ 2T(n-3) ] ]
...
T(n) = 2^k [ T(n-k) ]
由于我们之前描述的基本情况是
T(1) = 1
// Therefore
n = 1
k = 1
n = k
现在我们可以用我们的重复代替:
T(n) = 2^n [ T(1) ]
T(n) = 2^n [ O(1) ]
=> T(n) = 2^n
因此,您的重现是O(2^n)
答案 1 :(得分:3)
T(F(I))= T(F(I - 1))+ T(F(I - 1))+ O(1),所以它看起来像O(2 ^ n)。
(看看你的递归树,T(F(4))= T(F(3))+ T(F(2))+ T(F(1))+ O(1),而用T(F(3))代替T(F(2))+ T(F(1))你得到T(F(4))= T(F(3))+ T(F(3)) )
答案 2 :(得分:0)
我们可以通过归纳证明它是2 ^ n
首先我们证明F(n)=(2 ^ n-1)* F(1)
对于n = 1是正确的,所以让我们用n + 1来证明这一点
F(n + 1)= F(n)+ F(n-1)+ .. + F(1)
=(2 ^ n-1 + 2 ^ n-2 + ... + 2 ^ 0)* F(1)
=((1-2 ^ n)/(1-2))* F(1)= 2 ^ n * F(1)
所以我们有了公式,从中可以很容易地获得复杂性
答案 3 :(得分:-3)
因为你记忆,它将是O(n)时间。你在内存中使用O(n)来补偿它。