
CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -2-
COMPLEXITE ET NOTATION O( )
1/ Présentation
• En réalité, lorsqu’on cherche à évaluer l’efficacité d’un algorithme, il est souvent inutile d’aller jusqu’à ce niveau de
détail : on se contentera de dire que le nombre d’opérations effectuées est par exemple proportionnel à n. En effet :
- les opérations élémentaires ne demandent pas toutes exactement le même temps de calcul et cachent donc un
facteur multiplicatif, borné mais impossible à déterminer précisément ;
- le même programme peut être exécuté sur 2 machines différentes, l’une étant par exemple 2 fois plus rapide que
l’autre. Cela ne change évidemment rien à l’efficacité de l’algorithme, et ce qui nous intéresse réellement n’est pas le
temps précis d’exécution d’un programme, mais l’ordre de grandeur de ce temps en fonction de la taille des données ;
- il y a des termes dominants dans le temps d’exécution d’un algorithme : si on a déterminé que ce temps était
proportionnel à n2 + 3.n, le terme 3.n devient négligeable devant n2 dès que la taille n des données devient un peu
importante. Pour décrire l’efficacité d’un algorithme, seul le terme qui croît le plus vite a donc un intérêt. Dans ce
dernier cas, on dira que l'algorithme est de complexité O(n2).
• On dira qu’un algorithme a une complexité en O(f(n)) si son coût est, à partir d’un certain rang, inférieur au produit
de f(n) par une constante : il existe des entiers c et n0 tels que pour tout n ≥ n0, le coût ≤ c.f(n).
2/ Ordres de grandeur des temps d'exécution et exemples à connaître
• Il n’est pas possible de dire en combien de temps un algorithme en O(n) s’exécute pour une valeur particulière de n,
puisque 2 algorithmes dont les temps de calcul seraient respectivement n.10-9 s et n.109 s sont tous les deux en O(n).
Cependant, on peut donner les ordres de grandeur des temps d’exécution que l’on rencontre en pratique pour un
problème de taille n = 106 sur un ordinateur personnel actuel :
Temps d'exécution
pour n = 106
Le temps d’exécution ne dépend pas des données traitées,
ce qui est assez rare
Recherche par dichotomie
dans un tableau trié
Dans la dichotomie, c’est en fait la fonction log2(n) qu’on
voit apparaître ; mais comme la complexité est définie à un
facteur près, la base du logarithme n’a pas d’importance.
Parcours de liste, par
exemple recherche du
maximum dans une liste
Le temps d’exécution ne devient supérieur à 1 min que pour
des données de taille comparable à celle des mémoires
vives actuelles. Le problème de la gestion de la mémoire se
posera donc avant celui de l’efficacité en temps.
Parcours de tableau en 2D
Tri naïf
Cette complexité reste acceptable pour des données de
taille moyenne (n < 106) mais pas au-delà.
Algorithme à k boucles
imbriquées
Ici, nk est le terme de plus haut degré d’un polynôme en n ; il
n’est pas rare de voir des complexités en O(n3) ou O(n4).
plus de 10300000
milliards d’années
Un algorithme d’une telle complexité est impraticable sauf
pour de très petites données (n < 50). Comme pour la
complexité logarithmique, la base de l’exp. ne change
fondamentalement rien à l’inefficacité de l’algorithme.
• Les algorithmes suivants calculent et affichent différentes listes de nombres. Quelle est leur complexité ?
• Algorithme naïf de recherche d'un mot de m caractères dans une chaîne de n caractères : correspondant au
pire des cas, celui où le mot est absent de la chaîne.
Fonction Table1(n)
Début
Pour i 1 Jusqu'à i = 10 Faire
Ecrire(i*n)
FinPour
Fin
Fonction Table2(n)
Début
Pour i 1 Jusqu'à i = n Faire
Ecrire(i*i)
FinPour
Fin
Fonction Table3(n)
Début
Pour i 1 Jusqu'à i = n Faire
Pour j 1 Jusqu'à j = n Faire
Ecrire(i*j)
FinPour
FinPour
Fin