簡體   English   中英

Python Function 涉及列表操作的時間復雜度

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM