Python 內置方法的時間複雜度

轉載自: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)

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

  1. 對象的散列函數足夠擼棒(robust),不會發生衝突。
  2. 字典的鍵是從所有可能的鍵的集合中隨機選擇的。

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

操作 平均情況 最壞情況
複製 O(n) O(n)
取元素 O(1) O(n)
更改元素 O(1) O(n)
刪除元素 O(1) O(n)
遍歷 O(n) O(n)

個人主頁: https://www.lex666.online

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章