Ici, par analyse asymptotique, je suppose que nous entendons le comportement de l’algorithme lorsque la taille de l’entrée va à l’infini.
Nous utilisons l'analyse asymptotique parce
qu'elle est utile pour prédire le comportement des algorithmes en pratique . Les prédictions nous permettent de prendre des décisions, par exemple lorsque nous avons différents algorithmes pour un problème, lequel devons-nous utiliser? (Être utile ne veut pas dire que c'est toujours correct.)
La même question peut être posée à propos de tout modèle simplifié du monde réel. Pourquoi utilisons-nous des modèles mathématiques simplifiés du monde réel?
Pensez à la physique. La physique newtonienne classique n’est pas aussi bonne que la physique relativiste pour prédire le monde réel. Mais c’est un modèle suffisant pour la construction de voitures, de gratte-ciel, de sous-marins, d’avions, de ponts, etc. Dans certains cas, cela ne suffit pas, par exemple si nous voulons construire un satellite ou envoyer une sonde spatiale à Pluton ou prévoir le mouvement. des objets célestes massifs comme les étoiles et les planètes ou des objets à très grande vitesse comme les électrons.
Il est important de savoir quelles sont les limites d'un modèle.
C'est typiquement une assez bonne approximation du monde réel.
En pratique, nous voyons souvent qu’un algorithme avec une meilleure analyse asymptotique fonctionne mieux dans la pratique. Il est rare qu'un algorithme ait un meilleur comportement asymptotique. Ainsi, si les entrées peuvent être assez grandes, nous pouvons généralement nous baser sur une analyse asymptotique comme première prédiction du comportement des algorithmes. Ce n'est pas le cas si nous savons que les intrants vont être réduits. En fonction de la performance souhaitée, nous pouvons être amenés à effectuer une analyse plus minutieuse. Par exemple, si nous disposons d'informations sur la distribution des entrées, nous pouvons effectuer une analyse plus minutieuse pour atteindre les objectifs que nous avons définis. % d'intrants). L’analyse asymptotique est un bon point de départ. En pratique, nous devrions également faire des tests de performance, mais gardez à l'esprit que cela a aussi ses propres problèmes.
UNEUNEUNEa une meilleure complexité asymptotique. Qu'est-ce qu'aucun d'entre eux n'est meilleur que l'autre dans tous les intrants? Cela devient alors plus délicat et dépend de nos préoccupations. Est-ce que nous nous soucions des grands ou petits intrants? Si nous nous soucions des grandes entrées, il n’est pas courant qu’un algorithme ait une meilleure complexité asymptotique, mais se comporte le moins possible sur les grandes entrées qui nous intéressent. Si nous nous soucions davantage des petits intrants, l’analyse asymptotique pourrait ne pas être très utile. Nous devrions comparer la durée d'exécution des algorithmes sur les entrées qui nous intéressent. En pratique, l'analyse asymptotique peut ne pas être aussi utile pour des tâches complexes avec des exigences complexes. C'est très utile pour les problèmes de base simples abordés dans les manuels d'algorithmes.
En résumé, la complexité asymptotique est une approximation relativement facile de la complexité réelle des algorithmes pour des tâches de base simples (problèmes dans un manuel d’algorithmes). Au fur et à mesure que nous élaborons des programmes plus complexes, les exigences de performances changent et deviennent de plus en plus complexes. Une analyse asymptotique peut ne pas être aussi utile.
Il est bon de comparer l'analyse asymptotique à d'autres approches permettant de prédire la performance d'algorithmes et de les comparer. Les tests de performance par rapport à des entrées aléatoires ou de référence constituent une approche courante. Il est courant que le calcul de la complexité asymptotique soit difficile ou irréalisable, par exemple lorsque nous utilisons des méthodes heuristiques, comme par exemple la résolution SAT. Un autre cas de figure est celui où les exigences sont plus complexes, par exemple lorsque les performances d’un programme dépendent de facteurs extérieurs et que notre objectif peut être d’obtenir quelque chose qui se termine dans des délais déterminés (par exemple, pensez à mettre à jour l’interface affichée à un utilisateur) sur 99% des utilisateurs. contributions.
Mais gardez à l'esprit que l'analyse de la performance a aussi ses problèmes. Nous n'effectuons pas le test de performance sur toutes les entrées qui seront données à l'algorithme (souvent infaillibles sur le plan informatique) (et il est souvent impossible de décider que certaines entrées ne seront jamais données). Si nous testons sur un échantillon aléatoire ou un point de référence, nous supposons implicitement une certaine régularité
concernant les performances des algorithmes, autrement dit, l'algorithme fonctionnera de la même manière sur d'autres entrées qui ne faisaient pas partie du test de performance.
Le deuxième problème avec les tests de performance est qu'ils dépendent de l'environnement de test. Par exemple, les performances d’un programme ne dépendent pas uniquement des entrées, mais de facteurs extérieurs (type de machine, système d’exploitation, efficacité de l’algorithme codé, utilisation de la CPU, temps d’accès à la mémoire, etc.), dont certains peuvent varier entre différentes exécutions de programmes. le test sur la même machine. Ici encore, nous supposons que les environnements particuliers testés sont similaires à l'environnement réel, à moins que nous ne fassions les tests de performance sur tous les environnements sur lesquels nous pouvons exécuter le programme (et comment pouvons-nous prédire sur quelles machines une personne peut exécuter un tri) algorithme dans 10 ans?).
Θ ( n lgn )Θ ( n2)Θ ( lgn )O ( n )