web-dev-qa-db-ja.com

Pythonの* in *演算子の複雑さ

Pythonのin演算子の複雑さは何ですか?シータ(n)ですか?

次と同じですか?

def find(L, x)
   for e in L:
       if e == x:
           return True
   return False

Lはリストです。

40
Sajad Rastegar

inの複雑さは、Lが何であるかに完全に依存します。 _e in L_はL.__contains__(e)になります。

いくつかの組み込み型の複雑さについては、これを参照してください 時間の複雑さのドキュメント

inの概要は次のとおりです。

  • リスト-平均:O(n)
  • set/dict-平均:O(1)、最悪:O(n)

O(n)セットと辞書の最悪のケースは非常にまれですが、___hash___の実装が不十分な場合に発生する可能性があります。これは、セット内のすべてが同じハッシュを持つ場合にのみ発生します値。

90
Andrew Clark

コンテナのタイプに完全に依存します。ハッシュコンテナ(dictset)はハッシュを使用し、基本的にO(1)です。典型的なシーケンス(listTuple)は、推測通りに実装され、O(n)です。木は平均O(log n)になります。等々。これらの各タイプには、適切な__contains__そのbig-O特性を持つメソッド。

9
kindall

テストするコンテナによって異なります。それは通常、あなたが期待するものです-順序付けられたデータ構造では線形、順序付けられていない場合は定数です。もちろん、両方のタイプ(順序付きまたは順序なし)がありますが、それらはツリーのバリアントによって裏付けられている場合があります。

0
Marcin