递归函数的算法复杂性

时间:2011-10-12 15:32:09

标签: recursion complexity-theory asymptotic-complexity

这是我的功能。这是一个简单的问题,我对答案是什么并不自信。

  int calcul( int n) {
    if(n=1)
      return 1;
    else
      return calcul(n/2) + 1;
  }

现在,为了获得复杂性,我做了:

  

T(n)= T(n / 2)+ O(1)

     

T(n / 2)= T(n / 4)+ O(1)

     

...

     

T(1)= O(1)

现在,添加方程式,我得到了

  

T(n)= O(1)+ O(1)......

那么最终答案是什么?

4 个答案:

答案 0 :(得分:2)

每次将n除以2 log n次时,您执行的功能一次。

所以你得到O(log n)

修改

数字n的对数(基数2)是必须提高2才能获得n

2^(log n) = n,其中^表示取幂。

现在,计算log n近似值的一种简单方法是将n2 n > 1

如果您划分k次,则获得n < 2^k

由于k - 1分歧仍然产生n > 1,您还有n >= 2^(k-1)

2^(k - 1) <= n < 2^k的每个成员取对数,得到k - 1 <= log n < k

答案 1 :(得分:1)

该算法与http://en.wikipedia.org/wiki/Binary_search_algorithm

非常相似

所以,你可以阅读详细的解释,为什么它是O(log(n))

答案 2 :(得分:0)

我建议熟悉法师定理。在这种情况下,a = 1,b = 2且f = 0(1)。由于对于k = 0,f = Theta(1)= Theta(n ^(log_2(1)log ^ kn)= Theta(log ^ kn),我们处于定理的第二种情况,并且T(n)= Theta(log ^(k + 1)n)= Theta(log n)。

非常方便的定理,在与其他算法进行比较和进行其他类型的分析时非常有用。

答案 3 :(得分:0)

事情就是每次你的输入除以2直到它满足条件。恩。 n / 2,n / 4,n / 8 .... n / n

假设你输入为8,那么这个log 8 base 2将是3。 所以O(logn)。常数不应计算在内。

希望它有所帮助。