時間計算量比較
横長の表が見にくいのでどうにかしたい...
以下のページをもとにPythonの時間計算量を並べた。
載っていないメソッドについては、一部を自分で補足し、自分が理解していない残りはTBC。
https://wiki.python.org/moin/TimeComplexity
https://docs.python.org/ja/3/library/
https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
- List:配列。現在の割り当てサイズを超えて拡張したり、先頭に近い場所に挿入/削除すると遅い。
- TupleはListと同じOperationと時間計算量を持つimmutableなデータ構造。
- Deque:双方向連結リスト+双端。真ん中あたりのindexにアクセスすると遅い。
- Setはmutable、Frozensetはimmutableでハッシュ可。どちらも同じOperationと時間計算量を持つ。
- DictとDefaultdictは同じOperationと時間計算量を持つ。
- setのaddは末尾に追加するのわけではないけどappendに...
- dictはpython3.7以降順序も保存
- Operationに / がある場合 平均計算量/最悪計算量
- Exampleに / がある場合 類似形
- lstはリストやタプル
- Nは長さ
Operation | List | Deque | Set | Dict | ||||
---|---|---|---|---|---|---|---|---|
Example | Big(O) | Example | Big(O) | Example | Big(O) | Example | Big(O) | |
Index | l[i] | O(1) | d[0]/d[middle] | O(1)/O(N) | - | - | d[k]/d.get(k) | O(1) |
Store | l[i] = 0 | O(1) | - | - | - | - | d[k]=v | O(1) |
Length | len(i) | O(1) | len(d) | O(1) | len(s) | O(1) | len(d) | O(d) |
Append | l.append(0) | O(1) | d.append()/d.appendleft() | O(1) | s.add(5) | O(1) | - | - |
Pop | l.pop()/l.pop(i) | O(1)/O(N-i) | d.pop()/d.popleft() | O(1) | s.pop() | O(1) | d.pop(k)/d.popitem() | O(1) |
Clear | l.clear() | O(1) | d.clear() | TBC | s.clear() | O(1) | d.clear() | O(1) |
Slice | l[a:b] | O(b-a) | - | - | - | - | - | - |
Extend | l.extend(lst) | O(len(lst)) | d.extend(lst)/d.extendleft(lst) | O(len(lst)) | - | - | - | - |
Construction | list(lst) | O(len(lst)) | deque(lst) | O(len(lst) | set(lst) | O(len(lst) | dict(lst) | O(len(lst)) |
check == | l1 == l2 | O(N) | d1 == d2 | O(N) | d1 == d2 | O(N) | s1 == s2 | O(N) |
Insert | l[a:b]=lst | O(N) | - | - | - | - | - | - |
Delete | del l[i] | O(N-i) | - | - | - | - | del d[k] | O(1) |
Contain | x in l | O(N) | x in d | O(N) | x in s | O(1) | x in d | O(1) |
Copy | l.copy() | O(N) | d.copy() | O(N) | s.copy() | O(N) | d.copy() | O(N) |
Remove | l.remove(lst) | O(N) | d.remove(lst) | O(N) | s.remove(lst)/s.remove(lst) | O(1) | - | - |
MinMax | min(l) | O(N) | min(d) | O(N) | min(s) | O(N) | min(d.values()) | O(N) |
Reverse | l.reverse() | O(N) | list(reversed(d)) | O(N) | - | - | - | - |
Iteration | for x in l: | O(N) | for dd in d: | O(N) | for x in s: | O(N) | for k, v in d: | O(N) |
Sort | l.sort() | O(N log N) | sorted(d) | O(N) | sorted(s) | O(N) | sorted(d) | O(N) |
Multiply | N*K | O(NK) | - | - | - | - | - | - |
Rotate | - | - | d.rotate(i) | O(i) | - | - | - | - |
Union | - | - | - | - | s.union(t) | O(len(s)+len(t)) | - | - |
Intersection | - | - | - | - | s.intersection(t) | O(len(s)+len(t)) | - | - |
Difference | - | - | - | - | s.difference(t) | O(len(s)+len(t)) | - | - |
Symmetric Diff | - | - | - | - | s.symmetric_difference(t) | O(len(s)+len(t)) | - | - |