Python 以下算法的空间复杂度是多少?
下面的算法使用递归查找列表中最大的元素Python 以下算法的空间复杂度是多少?,python,python-3.x,recursion,Python,Python 3.x,Recursion,下面的算法使用递归查找列表中最大的元素 def largest(s): if len(s) == 0: return 'List can\'t be empty' elif len(s) == 1: return s[0] elif s[0] <= s[1]: return largest(s[1:]) else: s.remove(s[1]) return largest(s)
def largest(s):
if len(s) == 0:
return 'List can\'t be empty'
elif len(s) == 1:
return s[0]
elif s[0] <= s[1]:
return largest(s[1:])
else:
s.remove(s[1])
return largest(s)
时间复杂度是开启的,因为我们对函数的总调用数是n个最大的,并且每个调用执行O1操作。
我很难计算出空间的复杂性。我想它是开着的,但我不确定。切片一个标准列表确实会创建一个浅表!切片的副本。你说的对,这是成功的。在分配的额外内存中;不计算列表本身,当然它已经在内存中了
正如Reut在评论中指出的,这是Python解释器的一个实现细节,但我不能确定是否有解释器以不同的方式处理切片。任何在不复制的情况下创建切片的实现都必须改用写时复制。首先,时间复杂度不为on,因为list.remove操作不是O1,而是on。 因此,您的时间复杂度为^2-想象一下在这个数组上应用最大的时间复杂度[5 4 3 2 1] 您可以看到python操作复杂性的列表
空间复杂度为^2,因为当您执行return largests[1:]时,您复制的是列表,而不是引用,因此您保留了列表的所有中间部分。执行s.removes[0]然后返回最大值将增加空间复杂性,因为您正在处理引用 空间复杂度在技术上是开的,因为您正在传递列表的副本,但理论上是O1,因为它可能是python的其他实现中的引用。@ReutSharabani使用numpy数组将使其成为O1。