J'ai vu des gens dire que les set
objets en python ont une vérification d'appartenance O (1). Comment sont-ils mis en œuvre en interne pour permettre cela? Quel type de structure de données utilise-t-il? Quelles autres implications cette mise en œuvre a-t-elle?
Chaque réponse ici était vraiment éclairante, mais je ne peux en accepter qu'une, donc je vais aller avec la réponse la plus proche de ma question initiale. Merci à tous pour l'info!
la source
set
implémentation d' origine était en faitdict
avec des valeurs factices, et elle a été optimisée plus tard.Quand les gens disent que les ensembles ont une vérification d'appartenance O (1), ils parlent du cas moyen . Dans le pire des cas (lorsque toutes les valeurs hachées entrent en collision), la vérification d'appartenance est O (n). Voir le wiki Python sur la complexité du temps .
L' article de Wikipédia indique que la meilleure complexité temporelle pour une table de hachage qui ne se redimensionne pas est
O(1 + k/n)
. Ce résultat ne s'applique pas directement aux ensembles Python car les ensembles Python utilisent une table de hachage qui se redimensionne.Un peu plus loin, l'article de Wikipedia dit que pour le cas moyen , et en supposant une simple fonction de hachage uniforme, la complexité temporelle est
O(1/(1-k/n))
, oùk/n
peut être délimitée par une constantec<1
.Big-O se réfère uniquement au comportement asymptotique comme n → ∞. Puisque k / n peut être borné par une constante, c <1, indépendante de n ,
O(1/(1-k/n))
n'est pas plus grand queO(1/(1-c))
ce qui équivaut àO(constant)
=O(1)
.Donc, en supposant un hachage simple et uniforme, en moyenne , la vérification d'appartenance pour les ensembles Python est
O(1)
.la source
Je pense que c'est une erreur courante, la
set
recherche (ou la table de hachage d'ailleurs) ne sont pas O (1).sur Wikipédia
Connexes: Un hashmap Java est-il vraiment O (1)?
la source
Nous avons tous un accès facile à la source , où le commentaire précédent
set_lookkey()
dit:la source
Pour souligner un peu plus la différence entre
set's
etdict's
, voici un extrait dessetobject.c
sections de commentaires, qui clarifie la principale différence entre les sets et les dictionnaires.source sur github
la source