[英]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.