web-dev-qa-db-fra.com

Complexité de l'opérateur * in * en Python

Quelle est la complexité de l'opérateurinen Python? Est-ce thêta (n)?

Est-ce la même chose que ce qui suit?

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

L est une liste.

31
Sajad

La complexité de in dépend entièrement de ce que L est. e in L deviendra L.__contains__(e).

Voir ce document sur la complexité time pour la complexité de plusieurs types intégrés.

Voici le résumé pour in:

  • liste - Moyenne: O (n)
  • set/dict - Moyenne: O (1), Pire: O (n)

Le pire des cas O(n) pour les ensembles et les dessins est très rare, mais cela peut arriver si __hash__ est mal implémenté. Cela ne se produit que si tout dans votre ensemble a la même valeur de hachage.

76
Andrew Clark

Cela dépend entièrement du type de conteneur. Les conteneurs de hachage (dict, set) utilisent le hachage et sont essentiellement de type O (1). Les séquences typiques (list, Tuple) sont implémentées comme vous le devinez et sont O (n). Les arbres seraient en moyenne O (log n). Etc. Chacun de ces types aurait une méthode __contains__ appropriée avec ses caractéristiques big-O.

9
kindall

Cela dépend du conteneur que vous testez. C'est généralement ce que vous attendez - linéaire pour les infrastructures de données ordonnées, constant pour les non ordonnés. Bien sûr, il existe deux types (ordonné ou non ordonné) qui peuvent être pris en charge par une variante de l’arbre.

0
Marcin