2009-06-26 9 views
4

J'ai fait un googled assez longtemps pour trouver une comparaison qui montre les différences de complexité pour tous les conteneurs STL sur insert/push erase/pop etc. Je n'en ai trouvé aucun. Aussi pas dans tous mes livres STL. Un indice?Où puis-je trouver une comparaison de la complexité des conteneurs STL (performance)?

Je connais certaines règles de base bien sûr. Mais où est une définition?

+0

Il y a un tableau comparatif de la complexité ici: [http: // devmentor .org/references/stl/stl.php] (http://devmentor.org/references/stl/stl.php) – Meysam

+0

Je recommande de ne pas supprimer cette question, car les titres sont suffisamment différents. –

+0

http://www.cs.northwestern.edu/~riesbeck/programming/c++/stl-summary.html – TGar

Répondre

2

Essayez avec

http://www.sgi.com/tech/stl/complexity.html

http://www.sgi.com/tech/stl/table_of_contents.html

De complexity.html:

Au fond, il est difficile de définir la notion de complexité asymptotique algorithme précisément pour réel matériel informatique au lieu d'un modèle de machine abstraite. Ainsi, nous nous installons les directives suivantes:

  1. Pour un algorithme A pour avoir le temps en cours d'exécution O (f (n)), il doit y avoir un algorithme correspondant A » qui est correcte sur les machines avec arbitrairement longue types pointer et size_t, tels que que A et A 'exécutent essentiellement la même séquence d'opérations sur le matériel réel . (Dans les cas simples A et A « sera le même. Dans d'autres cas A peut avoir été simplifiée avec les connaissances que les adresses sont limitée.) Pour les entrées de suffisamment grande taille n, A » doit prendre au plus temps Cf (n), où C est une constante, indépendante de n et de l'adresse . (Pointeur, size_t et ptrdiff_t opérations sont présumés prendre temps constant indépendamment de leur taille .)
  2. Tous les conteneurs ou les spécifications de complexité iterator font référence à amorti complexité. Une opération individuelle peut prendre plus de spécifié. Mais toute séquence d'opérations suffisamment longue sur le même conteneur ou itérateur prendra à le plus longtemps que la somme correspondante des coûts d'opération spécifiés.
  3. Les algorithmes spécifient les performances dans le cas le plus défavorable ou le cas moyen, et identifient les performances. Sauf indication contraire, les moyennes supposer que les éléments conteneurs sont choisi parmi un type fini avec plus valeurs possibles que la taille du récipient , et que les éléments conteneurs sont indépendamment uniformément distribués.
  4. Une spécification de complexité pour une opération f suppose que les opérations invoquées par f nécessitent au plus l'exécution spécifiée . Mais les algorithmes restent généralement appropriés si les opérations invoquées ne sont pas supérieures à un facteur logarithmique inférieur à spécifié dans le cas prévu.
  5. Si les opérations sont plus coûteuses que celles assumées par une fonction F dans la STL actuelle , alors F ralentira à en proportion du coût supplémentaire. Toutes les opérations futures qui échouent à satisfont cette propriété, ce qui rendra explicite. Pour que ceci soit précis, supposons que F est spécifié pour utiliser le temps f (m) pour l'entrée de taille m. F utilise les opérations Gk, avec des durées spécifiées gk (n) sur taille d'entrée n. Si F est utilisé dans un contexte dans lequel chaque Gk est plus lent que prévu d'au plus un facteur h (n), alors F ralentit d'au plus un facteur h (m). Cela est vrai car aucun des algorithmes actuels n'appliquent les opérations Gk aux entrées significativement plus grand que m.

1

ISO C++ standard définit la complexité des algorithmes et des méthodes d'accès aux conteneurs, le cas échéant. Partout ailleurs (sinon explicitement) tous les paris sont désactivés et un implémenteur de bibliothèque est libre de faire sa propre implémentation. Par exemple, vous pouvez supposer que les cartes et les ensembles sont implémentés en utilisant des arbres rouge-noir, mais il n'y a aucune obligation de le faire. De nombreux algorithmes sont surchargés ou spécialisés pour des catégories d'itérateurs particulières (comme Random Access Iterator) et peuvent parfois même être optimisés pour fonctionner à partir d'un matériel spécial (comme le registre XMM et exécuter quelques opérations en parallèle).

Parfois vous devez vraiment assumer logiquement combien une opération peut coûter, en raison d'autres exigences, comme splice dans std :: list doit avoir O (1) complexité => longueur a O (n). J'ai le livre de N. Josuttis C++ Standard Library - Tutorial And Reference et tous ces aspects sont bien couverts là.

Cordialement,
Ovanes

+0

Selon www.cplusplus.com - "Constante dans tous les cas, sauf si x est un objet liste différent de * ceci dans la troisième version de la fonction, auquel cas il est linéaire dans la plage entre le premier et le dernier (avance de l'itérateur). " Cela semblerait impliquer que la longueur peut encore être implémentée en temps O (n), puisque dans le cas où vous épelez une plage de valeurs, l'épissure peut être linéaire (tous les autres cas sont aussi simples que l'addition des deux tailles ensemble) . Bien sûr, il est possible que certaines implémentations aient encore O (n) size() pour la liste. –

+0

Oui, c'était juste un exemple. cplusplus.com est un bon site, mais ISO C++ Standard est une réponse définitive. Les informations sur cplusplus.com sont tirées de la norme (probablement interprétée ou adaptée), mais rien n'est aussi définitif que la norme C++. Comme je l'ai déjà mentionné ci-dessus, si la norme ne précise pas. que cela dépend du fournisseur du compilateur et de cplusplus.com ne sera d'aucune aide non plus. Je pense surtout en cas de C++ il est très important de vérifier les choses suspectes là-bas. Trouver des choses en standard vous permettra de trouver beaucoup plus de choses liées et de développer considérablement les compétences en tant que développeur C++. – ovanes

+0

En fait, j'ai revérifié la norme et elle indique clairement la complexité de la plupart des algorithmes et la plupart des membres ou des opérations d'accès au conteneur. Un exemple: 25.3.5.2 set_union [lib.set.union] ... Effets: Construit une union triée des éléments des deux plages; ... Requiert: La plage résultante ne doit chevaucher aucune des plages d'origine. Retours: La fin de la plage construite. Complexité: Au plus 2 * ((last1 - first1) + (last2 - first2)) - 1 comparaisons. Remarques: Stable: si un élément est présent dans les deux plages, celui de la première plage est copié. – ovanes

Questions connexes