Bonjour,
Dans les leçons précédentes, nous avons construit un arsenal d'outils pour calculer la complexité des algorithmes. Nous avons analysé des algorithmes itératifs, résolu des récurrences simples par substitution, et maîtrisé le puissant théorème maître pour les algorithmes "diviser pour régner". Parallèlement, nous avons défini le langage formel de cette analyse : les notations asymptotiques O, Ω, et Θ.
Aujourd'hui, nous arrivons au point culminant de ce module. Notre objectif est de mettre en synergie toutes ces connaissances pour accomplir une tâche fondamentale en algorithmique : comparer l'efficacité de deux algorithmes et justifier formellement lequel est le meilleur. Pour un futur agrégé, il ne suffit pas d'avoir une intuition ; il faut savoir produire une démonstration rigoureuse. Cette leçon vous donnera les méthodes pour le faire.
1. La hiérarchie des ordres de grandeur
Avant toute chose, il est crucial de visualiser ce que "plus efficace" signifie. Quand on dit qu'un algorithme en est meilleur qu'un autre en , la différence n'est pas marginale, elle est colossale à mesure que la taille de l'entrée augmente.
Le graphique ci-dessous illustre cette divergence de manière frappante.

Intuitivement, on peut classer les fonctions de complexité usuelles dans une hiérarchie, de la plus efficace (croissance la plus lente) à la moins efficace (croissance la plus rapide) :
- Constant :
- Logarithmique :
- Linéaire :
- Linéarithmique :
- Polynomial : (avec , ex: , )
- Exponentiel : (avec , ex: )
- Factoriel :
Cette hiérarchie est votre première ligne d'analyse. Si l'algorithme A a une complexité qui se situe plus bas dans cette hiérarchie que la complexité de l'algorithme B, alors A est asymptotiquement plus efficace.
2. Une méthode pratique de comparaison
Pour la plupart des complexités que vous rencontrerez, qui sont souvent une combinaison de termes polynomiaux, logarithmiques et parfois exponentiels, il existe une règle de comparaison systématique.
La vidéo suivante expose cette méthode de manière claire et directe.
Comparer des complexités d'algorithmes données par des O()
Cette vidéo présente une "recette" très efficace pour comparer les fonctions de complexité typiques de la forme O(n^α (log n)^β γ^n).
Regardez l'intégralité de la vidéo (environ 4min30). L'auteur y explique la hiérarchie de dominance entre les trois types de facteurs : exponentiel, polynomial et logarithmique. Assurez-vous de bien comprendre l'ordre dans lequel il faut les comparer.
Pour résumer la méthode vue dans la vidéo, si vous devez comparer deux fonctions de complexité et , procédez comme suit :
- Comparez les bases exponentielles () : Si , alors croît plus vite que . Le facteur exponentiel domine tout le reste.
- Si les bases exponentielles sont égales, comparez les exposants polynomiaux () : Si , alors croît plus vite.
- Si les exposants polynomiaux sont aussi égaux, comparez les exposants logarithmiques () : Si , alors croît plus vite.
Cette méthode est un outil pragmatique et rapide, très utile en situation d'examen.
3. La justification formelle par les limites
La méthode précédente est excellente, mais pour une justification mathématique irréfutable, et pour traiter des cas plus généraux, l'outil de choix est l'étude de la limite du rapport des deux fonctions de complexité.
Soient deux algorithmes A et B avec des complexités respectives et . Pour les comparer, on étudie :
L'interprétation de la valeur de nous dit tout sur la relation asymptotique entre et :
-
Si : croît beaucoup plus vite que . On dit que est asymptotiquement plus petit que . L'algorithme A est plus efficace que B. Formellement, on note ("petit o").
-
Si , où est une constante finie et positive () : et croissent à la même vitesse. Leurs algorithmes respectifs ont la même classe de complexité asymptotique. Formellement, on note .
-
Si : croît beaucoup plus vite que . On dit que est asymptotiquement plus grand que . L'algorithme B est plus efficace que A. Formellement, on note ("petit oméga").
Le document suivant (en anglais, mais d'une grande clarté conceptuelle) détaille cette approche et la relie aux notations asymptotiques, y compris les notations "strictes" o et ω qui sont essentielles pour une comparaison formelle.
Asymptotic Notations - by Prajun Trital
Cet article, "Asymptotic Notations" par Prajun Trital, est une excellente ressource pour maîtriser la comparaison formelle. Il explique l'utilisation des limites et clarifie la distinction subtile mais cruciale entre les notations O/Ω/Θ et o/ω.
Lisez attentivement les trois premières sections de l'article : "Limit", "Asymptotic Notations", et "The Limit Rule: A Practical Roadmap". Concentrez-vous sur la manière dont la valeur de la limite (0, c, ou ∞) se traduit directement en une relation asymptotique (o, Θ, ou ω). Notez la définition formelle de o(g(n)) qui signifie "croît strictement moins vite que g(n)" et ω(g(n)) qui signifie "croît strictement plus vite que g(n)".
4. Mise en pratique : étude de cas
Appliquons cette méthode formelle pour comparer deux algorithmes d'exponentiation modulaire, qui calculent . C'est un exemple classique et très important, notamment en cryptographie.
Algorithme 1 : Exponentiation naïve
L'idée est simple : on multiplie a par lui-même b-1 fois, en prenant le modulo à chaque étape.
fonction puissance_naive(a, b, N)
res = 1
pour i de 1 à b:
res = (res * a) % N
retourner res
Chaque multiplication modulaire de grands nombres a un coût, disons en . Comme on effectue multiplications, la complexité totale est .
Algorithme 2 : Exponentiation rapide (binaire)
Cette méthode, plus astucieuse, utilise la décomposition binaire de l'exposant b. Le nombre de multiplications est proportionnel au nombre de bits de b, c'est-à-dire . La complexité est donc .
(Le détail de ces analyses de complexité est présenté dans les sections 2.2 et 2.2 du document LINK que nous utiliserons plus tard.)
Comparaison formelle :
Nous devons comparer et . (Le terme est une constante par rapport à b).
Utilisons la méthode des limites :
C'est une forme indéterminée . Nous pouvons utiliser la règle de L'Hôpital (vue dans la ressource LINK, section "Limit rules") :
Conclusion :
Puisque la limite est 0, nous avons . Cela signifie que la complexité de l'exponentiation rapide, , est asymptotiquement bien meilleure que celle de l'exponentiation naïve, . Le gain est exponentiel !
5. Exercices d'entraînement
Pour chaque paire de fonctions et ci-dessous, déterminez si , ou . Justifiez votre réponse par un calcul de limite.
- ,
- ,
- (complexité de Strassen), (complexité de la multiplication matricielle naïve)
- ,
- ,
Solutions
- . Donc, .
- . Comme , le polynôme l'emporte sur le logarithme. La limite est 0. Donc, .
- . . L'algorithme de Strassen est bien asymptotiquement plus efficace. .
- . Toute puissance de croît moins vite que toute puissance positive de . La limite est 0. Donc, , ce qui équivaut à .
- . On compare et . , car la base est . Donc, , ou .
Conclusion de la leçon et du module
Cette leçon achève notre premier module sur les fondements de l'analyse d'algorithmes. Vous êtes maintenant équipé pour non seulement calculer, mais aussi comparer formellement l'efficacité des algorithmes, une compétence absolument centrale pour l'Agrégation.
Points clés à retenir :
- La hiérarchie des fonctions de complexité (log, linéaire, polynomial, etc.) donne un premier ordre de comparaison rapide.
- Pour les fonctions de type , la règle exponentiel > polynomial > logarithmique est une méthode pratique et efficace.
- La méthode la plus rigoureuse est le calcul de la limite du rapport . Sa valeur (0, une constante positive, ou l'infini) détermine la relation asymptotique.
- Les notations et sont utilisées pour les comparaisons strictes, indiquant qu'un algorithme est définitivement "meilleur" ou "moins bon" qu'un autre.
Dans le prochain module, "Structures de Données Linéaires et Hachage", nous allons commencer à construire l'arsenal des structures de données fondamentales : piles, files, listes chaînées, etc. Pour chaque structure et chaque opération, nous appliquerons systématiquement les techniques d'analyse que vous venez d'apprendre pour en évaluer la performance. La théorie que nous avons établie devient maintenant notre principal outil pratique.