4
0

More than 3 years have passed since last update.

Python標準ライブラリにあるデータ構造の時間計算量

Last updated at Posted at 2020-07-30

時間計算量比較

横長の表が見にくいのでどうにかしたい...

以下のページをもとに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)) - -
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0