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
也就是说,基本情况需要一个时间单位才能完成,否则我们会对较小的问题实例进行两次递归调用,并进行一些设置和清理工作.我们得到了扩展这个重复的一些术语
这个系列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
扩展一些条款:
这给出了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).
希望这可以帮助!
使用递归树查找成本(通过可视化图表).
函数代价的递归关系(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)
类似的方式我们可以找到第二个函数的时间复杂度.