Intersection de la complexité
En Python, vous pouvez obtenir l'intersection de deux ensembles de fait:
>>> s1 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> s2 = {0, 3, 5, 6, 10}
>>> s1 & s2
set([3, 5, 6])
>>> s1.intersection(s2)
set([3, 5, 6])
Quelqu'un sait la complexité de cette intersection (&
) algorithme?
EDIT: En outre, personne ne sait quelle est la structure de données derrière un Python ensemble?
Vous devez vous connecter pour publier un commentaire.
La réponse semble être une requête moteur de recherche de suite. Vous pouvez également utiliser cette lien direct vers le Temps de la Complexité de la page à python.org. Résumé:
EDIT: Comme Raymond points ci-après, le "pire des cas" scénario n'est pas susceptible de se produire. Je l'ai inclus à l'origine pour être complet, et je pars à fournir le contexte de la discussion ci-dessous, mais je pense que Raymond droit.
C
et Moyenne (et aucun ordre exigence). L'exigence maximale de la complexité, autant que je sache, est d'environO(n log n) + O(n)
, avec une sorte. Cependant, le Big-O est un haut-limites et il y a des considérations d'ordre pratique donc...La algorithme d'intersection toujours s'exécute en O(min(len(s1), len(s2))).
En pur Python, il ressemble à ceci:
[Réponse à la question dans le supplémentaires modifier] La structure de données derrière des ensembles est une table de hachage.
elem in big
dans votre code est O(n) (bien qu'en moyenne, bien sûr, est de O(1)). C'est la base de l'intersection pire des cas en O(len(s)*len(t)). Aucune idée pourquoi?Ensemble intersection de deux ensembles de tailles
m,n
peut être réalisé avecO(max{m,n} * log(min{m,n}))
de la façon suivante:Supposons
m << n
La boucle à l'étape 3 sera exécuté pour
n/m
itérations et à chaque itération prendraO(m*logm)
, de sorte que vous aurez le temps de la complexité deO(nlogm)
pour m << n.Je pense que c'est la meilleure borne inférieure qui existe