pourrait-il être fait en gardant un compteur pour voir combien d'itérations un algorithme passe, ou la durée de temps doit-elle être enregistrée? P>
6 Réponses :
oui. p>
Vous pouvez suivre les performances réelles et le nombre d'itérations. P>
La complexité d'algorithme est définie comme (quelque chose comme :) p>
Nombre d'opérations L'algorithme fait en fonction de sa taille d'entrée. p> blockQuote>
Vous devez donc essayer votre algorithme avec diverses tailles d'entrée (c'est-à-dire de trier - essayez de trier 10 éléments, 100 éléments, etc.) et comptez chaque opération (E.G. Affectation, incrément, fonctionnement mathématique, etc.) L'algorithme fait. p>
Cela vous donnera une bonne estimation "théorique".
Si vous voulez des numéros de vie réelle, utilisez profilage . p>
En outre, la complexité des algorithmes n'est pas définie à terme de toutes les opérations. Par exemple, il est typique de supposer que l'addition entier est O (1), tandis que pour les grandes ajouts entier est O (journal n) où n est l'entier. Cela signifie qu'il n'existe pas une complexité d'algorithmes pour un algorithme donné: cela dépend également des opérations qui vous intéressent (généralement les plus coûteuses), ce qui explique pourquoi la complexité des algorithmes est exprimée en termes de nombre de comparaisons requises.
Pourrais-je suggérer d'utiliser des fourmis de profileur. Il vous fournira ce type de détail pendant que vous exécutez votre application avec des données «expérimentales». P>
Le meilleur moyen serait de compter réellement le nombre d'opérations effectuées par votre algorithme. La définition de «opération» peut varier: pour un algorithme tel que Quicksort, il pourrait s'agir du nombre de comparaisons de deux nombres. P>
vous pourrait mesurer em> mesurer le temps pris par votre programme pour obtenir une estimation approximative, mais divers facteurs pourraient entraîner une différence de cette valeur de la complexité mathématique réelle. P>
L'Actuellement accepté ne vous donnera aucune estimation théorique, à moins que vous ne soyez en quelque sorte capable d'adapter les temps expérimentaux mesurés avec une fonction qui les approche. Cette réponse vous donne une technique manuelle pour le faire et remplit cet écart.
Vous commencez par deviner em> la fonction de complexité théorique de l'algorithme. Vous mesurez également expérimentalement la complexité réelle (nombre d'opérations, temps ou tout ce que vous trouvez pratique), pour des problèmes de plus en plus gros. P> Par exemple, disons que vous devinez qu'un algorithme est quadratique. Mesure (disons) l'heure et calculez le rapport du temps à votre fonction devinée (n ^ 2): p> . Comme essentiellement qui utilise la définition de la notation Big O, que n code> se déplace vers l'infini, ce rapport ... p>
n code> comme vous avez essayé) li>
ul>
f (x) = O (g (x)) <=> f (x)
f (x) code> est le coût réel de votre algorithme,
g (x) code> est la supposition que vous mettez, et
c code> est une constante . Donc, fondamentalement, vous essayez de trouver de manière expérimentale la limite de
f (x) / g (x) code>; Si votre devinière frappe la complexité réelle, ce rapport estimera la constante
C code>. p> p>
C'est une réponse fantastique et m'a aidé à résoudre mes problèmes de complexité de temps, mais je suis sûr que vous avez obtenu le ratio le mauvais chemin. Par votre logique, testez un algorithme avec une complexité de temps constante (donc, temps / 1 code>) produirait un graphe croissant (si ce n'est pas O (1)), ce qui signifie que la suppression est trop élevée. Cela n'a pas de sens. Il ne le fait pas non plus pour O (n) si l'algorithme la vraie complexité n'est autre que O (n). Donc, je pense que le ratio est le mauvais chemin autour
Yup, c'est à l'envers. Il n'a pris que 10 ans pour que quelqu'un remarque: p
Comme d'autres personnes ont mentionné, la complexité du temps théorique est une fonction de nombre d'opérations de la CPU effectuées par votre algorithme. En général, le temps du processeur devrait être une bonne approximation de ce modulo une constante. Mais le temps réel peut varier en raison d'un certain nombre de raisons telles que: p>
à moins que votre code ne provoque systématiquement que certaines de ces choses se produisent, avec suffisamment de nombreux échantillons statistiques, vous devez avoir une assez bonne idée de la complexité temporelle de votre algorithme, basée sur le temps d'exécution observé. P>
En règle générale dans les documents de recherche, vous avez tendance à voir des arguments de la complexité de la théorie, mais des horaires actuels plutôt que d'essayer de compter la complexité théorique des logiciels - le point de penser à la complexité consiste à mieux comprendre l'efficacité et à la mesure de l'efficacité correspond à la rapidité du programme. fonctionne (ou parfois combien d'autres ressources telles que la mémoire qu'il consomme)