2个函数的时空复杂性

时间:2018-01-21 16:53:08

标签: python python-3.x algorithm time-complexity

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

嗨,我刚刚了解了空间和时间的复杂性。任何人都可以向我确认我是否正确地说foo的时间复杂度是O(n ** 2)并且foo的空间复杂度是O(n)?不太确定时间复杂度为foo调用bar只调用一次,而foo总是调用2个函数。

2 个答案:

答案 0 :(得分:0)

您每次拨打foo时都会说T作为输入参数,您需要从bar拨打1到{ {1}}。这意味着您正在执行以下操作:

T - 1

因此,通话次数如下:

foo's input     bar's inputs  
   1                1,
   2                2, 1,
   3                3, 2, 1
   4                4, 3, 2, 1
  ...
   n                n, n-1, n-2, ...

这是一个递归方程式,您可以将1, 2 , 3 , 4 , ... t 1 ,(1+2) , (1+2+3) , (1+2+3+4) , ... (t+t-1+t-2+...+1) 的递归方程式代替bar,只需找到大n

这意味着O的复杂性为O(t 2 ),并且由于放置foo bar的复杂性为O(n)n方程式中,您将获得O(n 2 )。

您还可以通过在foo的{​​{1}}行之前添加print('*')来检查呼叫次数,从而非常简单地检查:

return

正如你可以看到2,我们有3个电话3个,我们有6个电话,4个我们有10个电话。

答案 1 :(得分:0)

你是对的。这里的空间复杂度实际上是程序执行期间调用堆栈的最大深度,它是O(n)。对于foo的时间复杂度,您可以计算函数调用的数量:

NC(foo(n)) = NC(bar(n)) + NC(foo(n-1)) + 1

由于显而易见NC(bar(n)) = n + 1,我们(忽略那些常数“+ 1”部分):

NC(foo(n)) = n + NC(foo(n-1)) = n + (n-1) + NC(foo(n-2)) = 
= n + (n-1) + ... + 1 = n(n+1)/2 = O(n^2)