[英]Time complexity of Python Function Involving List Operations
當我在 plot 為不同大小輸入的以下算法所花費的時間時,時間復雜度似乎是多項式的。 我不確定是哪些操作導致了這一點。
我假設它與list(s)
, del l[i]
和l[::-1]
,但我不清楚這些單獨的復雜性是什么。 誰能解釋一下?
另外,有沒有辦法在不完全改變方法的情況下優化算法? (我知道有一種方法可以通過使用“雙端鉗形運動”將其降低到線性時間復雜度。)
def palindrome_index(s):
for i, c in enumerate(s):
l = list(s)
del l[i]
if l[::-1] == l:
return i
return -1
您的算法在len(s)
中確實是二次的:
在迭代i中,您在長度上執行線性時間操作:創建列表、反轉它,以及(平均線性地)擦除元素i 。 由於您執行此len(s)
次,因此它在len(s)
中是二次的。
我假設它與列表、del l[i] 和 l[::-1] 有關,但我不清楚這些單獨的復雜性是什么。 誰能解釋一下?
這些操作中的每一個都是線性時間(至少平均而言,這足以分析您的算法)。 從可迭代的或通過反轉現有列表來構造列表,在列表的長度上是線性的。 刪除元素i至少需要大約n - i + 1次移動元素,因為每個元素都向后移動一次。
所有這些都是線性的“O(n)”:
list(s)
list(s)
從s
創建一個新列表。 為此,它必須通過s
中的所有元素 go ,因此其時間與s
的長度成正比。
l[::-1]
就像list(s)
一樣, l[::-1]
創建一個新列表,其元素與l
相同,但順序不同。 它必須接觸每個元素一次,因此它的時間與l
的長度成正比。
del l[i]
In order to delete an element at position i
, the element which was at position i+1
has to be moved to position i
, then element which was at i+2
has to be moved to position i+1
etc. So, if you正在刪除第一個元素( del l[0]
),它必須觸摸移動列表的元素,如果您要刪除最后一個元素( del l[-1]
),它只需要刪除最后一個。 平均而言,它將移動n/2
元素,因此它也是線性的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.