我有两个功能,我想确定它的复杂性。
第一个我只需要知道我的解决方案是否正确,第二个是因为我正在努力寻找解决方案的两个递归调用,如果可能的话可以很好地完成工作以便我可以学习它是如何完成的。
首先:
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:])
非常感谢任何帮助。
问候
答案 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)
。