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

Ste*_*ven 8 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)
Run Code Online (Sandbox Code Playgroud)

tem*_*def 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).

希望这可以帮助!

  • 如果你愿意,添加一个关于memoization的注释似乎很合适,它可以将指数运行时减少到线性 (2认同)

sid*_*uff 7

使用递归树查找成本(通过可视化图表).

函数代价的递归关系(n)

                    T(n) = 2T(n-1)+c
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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)
Run Code Online (Sandbox Code Playgroud)

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