我有这个功能:
def rec(lst):
n = len(lst)
if n <= 1:
return 1
return rec(lst[n // 2:]) + rec(lst[:n // 2])
如何找到此函数的时间复杂度?
答案 0 :(得分:1)
通常在此类问题中,绘制递归树会有所帮助。
看看我添加的这张照片,请注意每个级别的总和为N(因为切片是此处要做的事情),
并且树的深度为logN(这很容易显示,因为我们每次都除以2,所以可以找到解释here)。因此,我们拥有的功能执行O(n)
n*logn
次,这意味着我们总共拥有O(n*logn)
。
现在,了解这种情况的另一种方式是使用“ Master Theorem”(我建议您查一下并了解它)
我们这里有T(n) = 2T(n/2) + O(n)
,因此根据定理a=2, b=2
使得log_b(a)
等于1,因此
我们有(根据定理的第二种情况):
T(n)=O(logn*(n**(log_b(a)))=O(nlogn)