9
votes

Comment peut-on tester la complexité de temps "expérimentalement"?

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?


1 commentaires

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)


6 Réponses :


0
votes

oui.

Vous pouvez suivre les performances réelles et le nombre d'itérations.


0 commentaires

6
votes

La complexité d'algorithme est définie comme (quelque chose comme :)

Nombre d'opérations L'algorithme fait en fonction de sa taille d'entrée.

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.

Cela vous donnera une bonne estimation "théorique".
Si vous voulez des numéros de vie réelle, utilisez profilage .


1 commentaires

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.



0
votes

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».


0 commentaires

1
votes

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.

vous pourrait mesurer 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.


0 commentaires

11
votes

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 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.

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): xxx

. Comme n se déplace vers l'infini, ce rapport ...

  • converge à zéro? Ensuite, votre hypothèse est trop bas . Répétez avec quelque chose de plus grand (par exemple N ^ 3)
  • diverge à l'infini? Ensuite, votre hypothèse est trop haut . Répétez avec quelque chose de plus petit (par exemple Nlogn)
  • converge à une constante positive? Bingo! Votre hypothèse est sur l'argent (au moins se rapproche de la complexité théorique de la valeur n comme vous avez essayé)

    essentiellement qui utilise la définition de la notation Big O, que f (x) = O (g (x)) <=> f (x) - f (x) est le coût réel de votre algorithme, g (x) est la supposition que vous mettez, et c est une constante . Donc, fondamentalement, vous essayez de trouver de manière expérimentale la limite de f (x) / g (x) ; Si votre devinière frappe la complexité réelle, ce rapport estimera la constante C .


2 commentaires

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 ) 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



2
votes

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:

  1. Pipeline de processeur Flushes
  2. cache manque
  3. Collection de déchets
  4. Autres processus de la machine

    à 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é.


0 commentaires