簡體   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