Si un algorithme effectue 3n2+5n+7 opérations, quelle est sa complexité en notation O ?
Avant de lire
Quelle est la complexité de la recherche dichotomique dans une liste triée de taille n ?
Motivation
L'analyse de la complexité permet de comparer l'efficacité des algorithmes indépendamment de la machine utilisée. On distingue :
Complexité en temps : nombre d'opérations élémentaires en fonction de la taille de l'entrée
Complexité en espace : quantité de mémoire utilisée
Notation de Landau
Définition. Soit f,g:N→R+. On écrit f(n)=O(g(n)) s'il existe C>0 et n0∈N tels que :
∀n≥n0,f(n)≤C⋅g(n)
On utilise aussi :
f(n)=Ω(g(n)) si g(n)=O(f(n))
f(n)=Θ(g(n)) si f(n)=O(g(n)) et f(n)=Ω(g(n))
Classes de complexité courantes
Complexité
Nom
Exemple
O(1)
Constante
Accès à un élément de liste par indice
O(logn)
Logarithmique
Recherche dichotomique
O(n)
Linéaire
Parcours d'une liste
O(nlogn)
Quasi-linéaire
Tri fusion
O(n2)
Quadratique
Tri par insertion (pire cas)
O(2n)
Exponentielle
Sous-ensembles d'un ensemble
Pause : vérifie
Parmi ces complexités, laquelle correspond à un algorithme exponentiel ?
O(2n) est exponentielle. O(n!) est factorielle (encore pire). O(n3) et O(nlogn) sont polynomiales.
Complexité dans le meilleur et le pire cas
Pour un algorithme donné, on distingue :
Complexité dans le pire casCpire(n) : le maximum sur toutes les entrées de taille n
Complexité dans le meilleur casCmeilleur(n) : le minimum
Complexité en Cmoy(n) : la moyenne sur toutes les entrées (avec une distribution de probabilité)
En CPGE, on s'intéresse le plus souvent à la complexité dans le pire cas.
Preuve de terminaison : le variant de boucle
Définition. Un variant de boucle est une quantité entière, positive, qui décroît strictement à chaque itération. Son existence prouve que la boucle termine.
Exemple : dans la recherche dichotomique, le variant est d−g (différence entre les bornes droite et gauche).
Pause : vérifie
Qu'est-ce qu'un variant de boucle ?
Un variant de boucle est une quantité entière, positive, qui décroît strictement à chaque itération. Son existence prouve la terminaison de la boucle.
Preuve de correction : l'invariant de boucle
Définition. Un invariant de boucle est une propriété qui est vraie avant la boucle, et qui reste vraie après chaque itération.
Exemple : pour le calcul de n! par une boucle :
def factorielle(n):
r = 1
for i in range(1, n + 1):
r = r * i
# Invariant : à l'entrée du tour i, r = (i-1)!
return r
L'invariant est : au début de l'itération i, on a r=(i−1)!. Après la dernière itération (i=n), on obtient r=n!.
Après la lecture
Si un algorithme effectue 3n2+5n+7 opérations, quelle est sa complexité en notation O ?
En notation O, on ne garde que le terme dominant et on ignore les constantes multiplicatives. 3n2+5n+7=O(n2).
Après la lecture
Quelle est la complexité de la recherche dichotomique dans une liste triée de taille n ?
À chaque étape, on divise l'intervalle de recherche par 2. Après k étapes, la taille est n/2k. On atteint 1 quand k=log2n.
Illustrations
Comparaison des complexités : linéaire, quasi-linéaire, quadratique