python 的時間複雜度

2022-06-25 15:30:13 字數 2816 閱讀 1737

本文翻譯自python wiki

本頁面涵蓋了python中若干方法的時間複雜度(或者叫「大歐」,「big

o」)。該時間複雜度的計算基於當前(譯註:至少是2023年之前)的cpython實現。其他python的實現(包括老版本或者尚在開發的

cpython實現)可能會在效能表現上有些許小小的差異,但一般不超過乙個o(log n)項。

本文中,』n』代表容器中元素的數量,』k』代表引數的值,或者引數的數量。

以完全隨機的列表考慮平均情況。

列表是以陣列(array)實現的。最大的開銷發生在超過當前分配大小的增長,這種情況下所有元素都需要移動;或者是在起始位置附近插入或者刪除元素,這種情況下所有在該位置後面的元素都需要移動。如果你需要在乙個佇列的兩端進行增刪的操作,應當使用collections.deque(雙向佇列)

操作

平均情況

最壞情況

複製o(n)

o(n)

o(1)

o(1)

插入o(n)

o(n)

取元素o(1)

o(1)

更改元素

o(1)

o(1)

刪除元素

o(n)

o(n)

遍歷o(n)

o(n)

取切片o(k)

o(k)

刪除切片

o(n)

o(n)

更改切片

o(k+n)

o(k+n)

extend[注1]

o(k)

o(k)

排序o(n log n)

o(n log n)

列表乘法

o(nk)

o(nk)

x in s

o(n)

min(s), max(s)

o(n)

計算長度

o(1)

o(1)

deque (double-ended queue,雙向佇列)是以雙向鍊錶的形式實現的 (well, a list of arrays

rather than objects, for greater

efficiency)。雙向佇列的兩端都是可達的,但從查詢佇列中間的元素較為緩慢,增刪元素就更慢了。

操作

平均情況

最壞情況

複製o(n)

o(n)

o(1)

o(1)

o(1)

o(1)

popo(1)

o(1)

popleft

o(1)

o(1)

extend

o(k)

o(k)

extendleft

o(k)

o(k)

rotate

o(k)

o(k)

remove

o(n)

o(n)

未列出的操作可參考 dict —— 二者的實現非常相似。

操作

平均情況

最壞情況

x in s

o(1)

o(n)

並集 s|t

o(len(s)+len(t))

交集 s&t

o(min(len(s), len(t))

o(len(s) * len(t))

差集 s-t

o(len(s))

s.difference_update(t)

o(len(t))

對稱差集 s^t

o(len(s))

o(len(s) * len(t))

s.symmetric_difference_update(t)

o(len(t))

o(len(t) * len(s))

由原始碼得知,求差集(s-t,或s.difference(t))運算與更新為差集(s.difference_uptate(t))運算的時間複雜度並不相同!前者是將在s中,但不在t中的元素新增到新的集合中,因此時間複雜度為o(len(s));後者是將在t中的元素從s中移除,因此時間複雜度為o(len(t))。因此,使用時請留心,根據兩個集合的大小以及是否需要新集合來選擇合適的方法。

集合的s-t運算中,並不要求t也一定是集合。只要t是可遍歷的物件即可。

下列字典的平均情況基於以下假設:

1. 物件的雜湊函式足夠擼棒(robust),不會發生衝突。

2. 字典的鍵是從所有可能的鍵的集合中隨機選擇的。

小竅門:只使用字串作為字典的鍵。這麼做雖然不會影響演算法的時間複雜度,但會對常數項產生顯著的影響,這決定了你的一段程式能多快跑完。

操作

平均情況

最壞情況

複製[注2]

o(n)

o(n)

取元素o(1)

o(n)

更改元素[注1]

o(1)

o(n)

刪除元素

o(1)

o(n)

遍歷[注2]

o(n)

o(n)

dfs時間複雜度 時間複雜度 空間複雜度

時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...

時間複雜度 空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...