我不确定以下函数的空间复杂度是多少?是O(n)
还是O(1)
?
# Do rotation
def foo(arr):
arr[:] = arr[5:] + arr[:5]
答案 0 :(得分:3)
arr[5:]
和arr[:5]
中的每一个都会建立一个新列表,然后再加入另一个新列表,这些新列表就地分配给arr
。 arr[5:]
和连接列表都要求空间复杂度为 O(n),因此总体空间复杂度为 O(n)。
答案 1 :(得分:1)
这取决于arr
的类型,但是假设它是list
,则为O(n),因为RHS上的两个片都创建了新的list
对象,尽管是暂时的。将这两个连接成一个第三个新列表,然后将其元素复制到arr
引用的现有列表中。
您可以通过使用itertool.slice
避免进行复制来实现O(1)空间复杂度:
def foo(arr):
arr[:] = chain(islice(arr, 5, None), islice(arr, 5))