递归函数的复杂性(Big O表示法)

时间:2016-03-30 08:49:55

标签: time-complexity big-o

我有两个功能,我想确定它的复杂性。

第一个我只需要知道我的解决方案是否正确,第二个是因为我正在努力寻找解决方案的两个递归调用,如果可能的话可以很好地完成工作以便我可以学习它是如何完成的。

首先:

def sum(list):
    assert len(list)>0
    if len(list) == 1:
        return list[0]
    else:
        return sum(list[0:-1]) + list[-1]

尝试解决方案:

T(0) = 4
T(n) = T(n-1) + 1 + c -- True for all n >0 

T(n) = T(n-1) + 1 + c
     = T(n-2) + 2 + 2C
     = T(n-k) + k = kC --(n-k = 0 implies that k=n)
T(n) = T(0) + n + nC
     = T(0) + 2nC --(T0 is nothing but 4)
     = 6nC
Complexity = O(n)  

第二

def binSum(list):
    if len(list) == 1:  
        return list[0]
    else:
        return binSum(list[:len(list)//2]) + binSum(list[len(list)//2:])

非常感谢任何帮助。

问候

1 个答案:

答案 0 :(得分:0)

对于第一种情况,您可以使用递归函数T(n) = T(n-1) + O(1)T(0) = O(1)对时间复杂度建模。这显然解决了T(n) = O(n)

通过归纳,这是一个更直接,更正式的证明。基本案例很简单:T(0)<=C定义O(1)。对于归纳步​​骤,假设所有T(k) <= C*k k<=n为绝对常数C>0。现在T(n+1) <= D + T(n) <= D + C*n <= max(C,D)*(n+1)归纳假设,其中D>0是绝对常数。

对于第二种情况,您可以使用T(n) = T(n/2) + T(n/2) = 2T(n/2)n>1的{​​{1}}为时间复杂度建模。这通过master theorem解析为T(1)=O(1)