繁体   English   中英

Python 列表插入运行时间复杂度

[英]Python list insertion run time complexity

我知道插入列表是O(n) ,因为最坏的情况是插入索引0

现在我的问题是,如果我们让AB成为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM