Analyse de la complexité algorithmique
Vidéo disponible dans la version Premium
Durée : 55 min
Analyse de la complexité algorithmique
1. Pourquoi mesurer la complexité ?
Pour comparer deux algorithmes résolvant le même problème, on ne mesure pas leur temps d'exécution en secondes (qui dépend de la machine, du langage, etc.) mais le nombre d'opérations élémentaires effectuées, en fonction de la taille de l'entrée. C'est la complexité temporelle. On définit de même la complexité spatiale (mémoire utilisée).
2. Notations de Landau : , ,
Soient . On dit :
- (« est dominée par ») s'il existe et tels que pour tout — majoration asymptotique ;
- s'il existe tels que pour — minoration asymptotique ;
- si et — l'ordre de grandeur exact.
Exemple : . On a (car pour , ) et (car ), donc : l'algorithme est de complexité quadratique.
3. Classes de complexité usuelles
Par ordre croissant de coût (pour grand) : (constant), (logarithmique), (linéaire), (quasi-linéaire), (quadratique), (polynomiale), (exponentielle), (factorielle).
Exemple typique : la recherche dans un tableau trié par dichotomie est ; le tri par insertion est dans le pire cas ; le tri fusion est .
4. Calcul de complexité : boucles et récursivité
Boucles simples : une boucle parcourant éléments une fois coûte . Deux boucles imbriquées, chacune de taille , coûtent (produit des tailles, dans le cas indépendant).
Récursivité — équation de récurrence. Pour un algorithme récursif qui divise le problème en sous-problèmes de taille chacun, avec un coût pour combiner les résultats, la complexité vérifie :
Théorème maître (cas simplifié, ) : en posant :
- si : ;
- si : ;
- si : .
Exemple — tri fusion : sous-tableaux, (taille chacun), fusion en (donc ). On a , donc .
Exemple — recherche dichotomique : sous-problème de taille , coût de combinaison (donc ). , donc .
5. Récursivité naïve : Fibonacci
Le calcul naïf de par double récursion () a une complexité où est le nombre d'or — exponentielle, car l'arbre des appels recalcule de nombreuses fois les mêmes sous-problèmes. La mémoïsation (stocker les résultats déjà calculés) ramène ce coût à : c'est le principe de la programmation dynamique.
6. Pire cas, meilleur cas, cas moyen
On distingue généralement :
- la complexité dans le pire cas : borne valable pour toute entrée de taille (la plus utilisée en pratique, car elle garantit une performance) ;
- la complexité dans le meilleur cas : la plus petite complexité possible parmi les entrées de taille ;
- la complexité en moyenne : espérance sur une distribution donnée des entrées.
Exemple — tri rapide (quicksort) : en moyenne, mais dans le pire cas (pivot systématiquement mal choisi, par exemple sur un tableau déjà trié avec un pivot toujours pris en première position).
7. Récapitulatif
| Notation | Signification |
| majorée asymptotiquement par (à une constante près) | |
| minorée asymptotiquement par | |
| et du même ordre de grandeur | |
| théorème maître : (avec facteur si ) |
Exercices
Que signifie ?
Vrai ou faux : un algorithme de complexité est, pour grand, plus rapide qu'un algorithme de complexité .
Quelle est la complexité d'une boucle simple parcourant un tableau de taille une seule fois ?
Vrai ou faux : la recherche dichotomique dans un tableau trié de taille a une complexité .
Quelle est la complexité, dans le pire cas, du tri rapide (quicksort) ?
Suivez votre progression
Connectez-vous pour sauvegarder votre avancement et gagner des XP.