轉載自:http://www.orangecube.NET/Python-time-complexity
本文中,’n’代表容器中元素的數量,’k’代表參數的值,或者參數的數量。
列表(list)
以完全隨機的列表考慮平均情況。
列表是以數組(Array)實現的。最大的開銷發生在超過當前分配大小的增長,這種情況下所有元素都需要移動;或者是在起始位置附近插入或者刪除元素,這種情況下所有在該位置後面的元素都需要移動。如果你需要在一個隊列的兩端進行增刪的操作,應當使用collections.deque(雙向隊列)
操作 | 平均情況 | 最壞情況 |
---|---|---|
Copy | O(n) | O(n) |
Append | O(1) | O(1) |
Pop last | O(1) | O(1) |
Pop intermediate | O(k) | O(k) |
Insert | O(n) | O(n) |
Get Item | O(1) | O(1) |
Set Item | O(1) | O(1) |
Delete Item | O(n) | O(n) |
Iteration | O(n) | O(n) |
Get Slice | O(k) | O(k) |
Del Slice | O(n) | O(n) |
Set Slice | O(k+n) | O(k+n) |
Extend | O(k) | O(k) |
Sort | O(n log n) | O(n log n) |
Multiply | O(nk) | O(nk) |
x in s | O(n) | |
min(s), max(s) | O(n) | |
Get Length | O(1) | O(1) |
雙端隊列(collections.deque)
deque (double-ended queue,雙端隊列)從內部來看實際上是雙端鏈表。雙端隊列的兩端都是可達的,但查找隊列中間的元素較爲緩慢,增刪元素就更慢。
操作 | 平均情況 | 最壞情況 |
---|---|---|
Copy | O(n) | O(n) |
append | O(1) | O(1) |
appendleft | O(1) | O(1) |
pop | O(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) |
集合(set)
未列出的操作可參考 dict —— 二者的實現非常相似。
操作 | 平均情況 | 最壞情況 | 說明 |
---|---|---|---|
x in s | O(1) | O(n) | |
Union s | t | O(len(s)+len(t)) | |
Intersection s&t | O(min(len(s), len(t)) | O(len(s) * len(t)) | replace “min” with “max” if t is not a set |
Multiple intersection s1&s2&…&sn | (n-1)*O(l) where l is max(len(s1),…,len(sn)) | ||
Difference s-t | O(len(s)) | ||
s.difference_update(t) | O(len(t)) | ||
Symmetric Difference 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是可遍歷的對象即可。
字典(dict)
下列字典的平均情況基於以下假設:
- 對象的散列函數足夠擼棒(robust),不會發生衝突。
- 字典的鍵是從所有可能的鍵的集合中隨機選擇的。
注意:只使用字符串作爲字典的鍵。這麼做雖然不會影響算法的時間複雜度,但會對常數項產生顯著的影響,這決定了你的一段程序能多快跑完。
操作 | 平均情況 | 最壞情況 |
---|---|---|
複製 | O(n) | O(n) |
取元素 | O(1) | O(n) |
更改元素 | O(1) | O(n) |
刪除元素 | O(1) | O(n) |
遍歷 | O(n) | O(n) |