La notation Big O est un moyen sans unité de mesure de la variation des performances, donc insensible aux coûts relatifs des primitives de calcul.
En résumé: la
notation Big O est un type de mesure relatif sans unité (par opposition à la mesure absolue). Il ne peut mesurer que les variations de performances, pas les performances absolues, pour lesquelles les constantes comptent beaucoup. L'avantage est que cela le rend largement indépendant de l'implémentation, en permettant une analyse plus simple qui peut ignorer les coûts relatifs des opérations élémentaires, tant que ces coûts ont des limites supérieures et inférieures fixes positives. Mais la conséquence est que les facteurs constants n'ont pas de sens . Pourtant, même pour son objectif, l' analyse de la complexité asymptotique peut être remise en question pour d'autres motifs et doit être considérée avec prudence. Par exemple, la taille d'entrée brute peut ne pas être le bon paramètre à considérer.
Une première remarque est que votre question n'est pas formulée avec précision. Lorsque vous négligez la constante sur 3 n , il y a en effet un "triple changement", mais les deux varient au même rythme, et vous ne pouvez pas affirmer que "[une] chose varie 3 fois plus rapidement que les autres".33 n
Une bonne raison d'ignorer la constante de la notation Landau est que nous n'avons aucune unité sur laquelle nous pouvons compter. Quand quelqu'un déclare que A vit deux fois plus loin de vous que B, cela a un sens indépendamment de toute unité. Nous pouvons nous mettre d'accord sur ce point même si vous mesurez des distances en pouces alors que je le fais en années-lumière. Mais la mesure de distance absolue nécessite de spécifier des unités, et sa formulation numérique dépend de l'unité choisie.
Le temps réel pris par un algorithme dépend du temps d'exécution des opérations élémentaires, qui est très dépendant de la machine. Vous pouvez compter le nombre d'opérations élémentaires, mais il n'y a aucune raison de croire qu'elles prennent toutes le même temps, et il est toujours possible de combiner plusieurs opérations en une seule, ou inversement de décomposer une opération en plus petites, de sorte que le nombre des opérations n'a pas vraiment de sens, sauf si vous êtes d'accord sur une machine virtuelle de référence. Être indépendant de la référence est un avantage.
Une autre vue de l'avantage de l'approche est que tout ce qui vous intéresse dans l'analyse est de compter le nombre d'opérations élémentaires, tant que leur coût a une limite supérieure et une limite inférieure positive. Vous n'avez pas à vous soucier du coût individuel.
Cependant, le prix à payer pour cet avantage est que l'évaluation des coûts de calcul est donnée avec une unité non spécifiée, et le temps de calcul, par exemple, pourrait être des nanosecondes ou des millénaires - nous n'essayons même pas de savoir. En d'autres termes, les facteurs constants n'ont pas de sens, car le changement d'unités est inséparable du changement de facteur constant et aucune unité de référence n'est utilisée.
Comme l'a noté Patrick87 , cela suffit pour comprendre comment un algorithme évolue par rapport à la taille d'entrée, mais il ne donnera pas une mesure absolue des performances, à moins de s'appuyer sur une unité de référence. La suppression d'une machine abstraite de référence commune peut être effectuée lorsque l'on souhaite réellement comparer les performances d'algorithmes distincts, mais il est plus difficile de s'assurer que la comparaison n'est pas biaisée par les détails de réalisation. Dans la complexité asymptotique, ce risque est évité car vous comparez l'algorithme avec lui-même.
Quoi qu'il en soit, seul un programmeur naïf s'appuierait exclusivement sur la complexité asymptotique pour choisir un algorithme. Il existe de nombreux autres critères, y compris la constante incalculable et le coût réel des opérations élémentaires. En outre, la complexité du pire des cas peut être un mauvais indicateur, car la source de la complexité du pire cas peut se produire rarement, et sur des fragments d'entrée suffisamment petits pour avoir un impact limité. Par exemple, les analyseurs syntaxiques généraux pour les grammaires adjacentes aux arbres ont une complexité théorique et sont tout à fait utilisables en pratique. Le pire cas que je connaisse est l'
inférence de type polymorphe Damas-Hindley-MilnerO ( n6)algorithme utilisé pour ML, qui a une complexité exponentielle dans le pire des cas. Mais cela ne semble pas déranger les utilisateurs de ML, ni empêcher l'écriture de très gros programmes en ML. Il y a plus que la constante qui compte. En fait, l'analyse asymptotique relie une mesure du coût d'un calcul à une certaine mesure de la complexité de l'entrée. Mais la taille brute n'est peut-être pas la bonne mesure.
La complexité est comme la décidabilité, elle peut être théoriquement mauvaise, mais cela peut ne pas être pertinent pour la plupart de l'espace de données ... parfois. L'analyse de complexité asymptotique est un bon outil bien conçu, avec ses avantages et ses limites, comme tous les outils. Avec ou sans explicitation de la constante, qui peut être dénuée de sens, le jugement est nécessaire.