[英]Python list insertion run time complexity
我知道插入列表是O(n)
,因为最坏的情况是插入索引0
。
现在我的问题是,如果我们让A
, B
成为len(A) = len(B) = N
列表,并且我们试图以这种方式将B
中的每个元素插入A
中:
A[0:0] = B
需要O(N^2)
吗?
根据我对 Python 中列表如何工作的了解,使用切片复制列表实际上并不执行任何插入,它只是将 A 中每个索引处的元素替换为 B 中相同索引处的元素。它将花费O(n)
时间,因为它本质上是对列表 A 执行线性扫描,但需要为每个索引分配一个新值的附加步骤,每次分配本身需要O(1)
。
附带说明一下, A[0:0] = B
不会将列表 B 的内容复制到列表 A 中,除非 A 是一个空列表,即A = []
。 否则,B 的内容会附加到 A 上,导致 A 的长度为 2N,而不是所需的 N。 这本身将花费 $O(n^2)$,因为它本质上为列表 B 的每个元素执行最坏情况的插入。
如果您想通过复制列表 B 的内容来覆盖列表 A 中的任何内容,我建议您执行以下操作:
A = B[:]
如果这不是您要查找的内容, 这篇 GeeksforGeeks 文章列出了许多将列表复制到另一个列表的不同方法。
它应该是线性的( O(n)
),但这里是实验检查(2 到 10^8 个项目,除了最后 3 个点(只有 20 个)之外,每个运行 100 个):
注意。 前几个点的开销不可忽略,可能是由于不断的操作(切片、分配)。
每个点都是使用timeit
计算的:
n = 10 # number or items in list, to make variable in a loop
r = 100 # or 20
t = {}
t[n] = timeit('A[0:0] = B', number=r,
setup=f'A = list(range({n})) ; B = list(range({n}))'
)/r
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.