两个简单递归函数的Big-O表示法

时间:2013-04-20 00:06:02

标签: python algorithm math recursion big-o

我在Python中有两个递归函数,只是想知道它们的Big O表示法。每个人的大O是什么?

def cost(n):
    if n == 0:
        return 1
    else:
        return cost(n-1) + cost(n-1)

def cost(n):
    if n == 0:
        return 1
    else:
        return 2*cost(n-1)

2 个答案:

答案 0 :(得分:15)

让我们用递归关系来解决这个问题!第一个函数的运行时可以递归描述为

  

T(0)= 1

     

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

也就是说,基本情况需要一个时间单位才能完成,否则我们会对较小的问题实例进行两次递归调用,并进行一些设置和清理工作。在此重复中扩展一些术语,我们得到

  • T(0)= 1
  • T(1)= 2T(0)+ 1 = 2 + 1 = 3
  • T(2)= 2T(1)+ 1 = 2×3 + 1 = 7
  • T(3)= 2T(2)+ 1 = 2×7 + 1 = 15

这个系列1,3,7,15 ......可能看起来很熟悉,因为它是2 1 - 1,2 2 - 1,2 3 - 1等。更一般地说,我们可以证明

  

T(n)= 2 n + 1 -1

我们可以通过归纳来做到这一点。作为我们的基本情况,T(0)= 1 = 2 1 - 1,因此声明适用于n = 0.现在假设对于某些n,T(n)= 2 n +1 - 1.然后我们有

  

T(n + 1)= 2T(n)+ 1 = 2(2 n + 1 -1)+ 1 = 2 n + 2 - 2 + 1 = 2 n + 2 - 1

我们已经完成了!由于这个重复发生到2 n + 1 - 1 = 2(2 n ) - 1,我们得到运行时为Θ(2 n )。

第二个函数的运行时可以递归描述为

  

T(0)= 1

     

T(n + 1)= T(n)+ 1

扩展一些条款:

  • T(0)= 1
  • T(1)= T(0)+ 1 = 1 + 1 = 2
  • T(2)= T(1)+ 1 = 2 + 1 = 3
  • T(3)= T(2)+ 1 = 3 + 1 = 4

这给出了1,2,3,4 ......,所以更一般地说我们可能会猜到

  

T(n)= n + 1

我们可以再次证明这一点。作为基本情况,如果n = 0,则T(0)= 1 = 0 + 1.对于归纳步​​骤,假设对于某些n,T(n)= n + 1.然后

  

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

我们已经完成了!由于运行时为n + 1,因此运行时为Θ(n)。

希望这有帮助!

答案 1 :(得分:7)

使用递归树查找费用(通过可视化图表)。

函数成本(n)的递归关系

                    T(n) = 2T(n-1)+c

enter image description here

If at kth level input size become 0 (base condition where func terminates)
                                           n-k =0
                                              k=n


Total cost of the function (adding cost of each level) :
             T(n) = 2^0*c+ 2^1*c + 2^2*c + 2^3*c +.. .. . .+ 2^n * c
                  = O(2^n)

类似的方式我们可以找到第二个函数的时间复杂度。