递归树的时间复杂度

时间:2016-06-24 12:24:08

标签: algorithm recursion time-complexity

函数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)

4 个答案:

答案 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)来补偿它。