Informatique · Première · 4 min de lecture
Coût d'un algorithme : compter les opérations
Estimer comment le nombre d'opérations d'un algorithme varie avec la taille n des données : coût constant, logarithmique (la donnée est divisée par deux à chaque étape), linéaire (une boucle sur les n éléments), quadratique (deux boucles imbriquées) ; quand n double, un coût linéaire double, un coût quadratique est multiplié par quatre, un coût logarithmique augmente d'une étape ; intérêt de passer d'un coût quadratique en n² à n log₂ n, ou de n à log₂ n, sur des données nombreuses.
Chapitre du programme : Numérique et sciences informatiques (spécialité)
Bloc 1 sur 7 · Comprendre
Comprendre : comment le travail grandit avec n
Le coût d'un algorithme mesure comment son nombre d'opérations varie avec la taille n des données. On ne cherche pas un nombre exact, mais un ordre de grandeur quand n devient grand. Pour l'estimer, on compte les tours de boucle en fonction de n.
Les quatre fonctions ci-dessous comptent leurs propres tours, pour n = 64, 128, 256 et 512 :
def tours_log(n):
c = 0
while n > 1:
n = n // 2
c = c + 1
return c
def tours_lineaire(n):
c = 0
for i in range(n):
c = c + 1
return c
def tours_quadratique(n):
c = 0
for i in range(n):
for j in range(n):
c = c + 1
return c
for n in [64, 128, 256, 512]:
print(n, tours_log(n), tours_lineaire(n), tours_quadratique(n))64 6 64 4096
128 7 128 16384
256 8 256 65536
512 9 512 262144Quand n double : le coût logarithmique augmente d'une étape, le coût linéaire double, le coût quadratique est multiplié par quatre.
Bloc 2 sur 7 · Approfondir
Approfondir : boucles qui se suivent, boucle fixe
Deux boucles qui se suivent s'additionnent. Ci-dessous, n tours puis 3n tours : 4n en tout, ce qui reste linéaire. Ce sont des boucles imbriquées qui se multiplient.
Une boucle dont le nombre de tours est fixé ne dépend pas de n : range(10) fait toujours 10 tours, le coût est constant.
def deux_boucles(n):
c = 0
for i in range(n):
c = c + 1
for j in range(3 * n):
c = c + 1
return c
def boucle_fixe(n):
c = 0
for i in range(10):
c = c + 1
return c
for n in [100, 200, 400]:
print(n, deux_boucles(n), boucle_fixe(n))100 400 10
200 800 10
400 1600 10Pourquoi c'est important. Pour un million de données, un tri en n² ferait de l'ordre de 10¹² opérations, un tri en n log₂ n environ 2 × 10⁷ ; une recherche en log₂ n une vingtaine d'étapes au lieu d'un million :
from math import log2
n = 10 ** 6
print(round(n * log2(n)))
print(n * n)
print(round(log2(n)))19931569
1000000000000
20Bloc 3 sur 7 · Exemple
Exemple guidé : reconnaître un coût quadratique
Énoncé. Quand n devient grand, comment varie le nombre d'opérations de cette fonction ?
def f(n):
c = 0
for i in range(n):
for j in range(i):
c = c + 1
return c
print(f(100), f(200), f(400))Résolution.
- Deux boucles imbriquées : la boucle intérieure fait i tours, pour i allant de 0 à n − 1.
- Au total : 0 + 1 + … + (n − 1) = n(n − 1)/2 passages, de l'ordre de n².
- Contrôle par l'exécution : quand n double, le nombre de passages est presque multiplié par quatre.
4950 19900 79800Le coût est quadratique : de l'ordre de n², même si la boucle intérieure ne fait pas toujours n tours.
Bloc 4 sur 7 · Visualiser
Voir : les quatre classes de coût
| Classe | Forme typique | n = 64 | n = 128 | Quand n double |
|---|---|---|---|---|
| Constant | aucune boucle, ou boucle fixe range(10) | 10 | 10 | inchangé |
| Logarithmique | while qui divise n par 2 | 6 | 7 | + 1 étape |
| Linéaire | une boucle sur n éléments | 64 | 128 | × 2 |
| Quadratique | deux boucles imbriquées de n tours | 4 096 | 16 384 | × 4 |
Les valeurs sont celles comptées par les programmes de la leçon.
Continuez sur votre lancée
Vous avez découvert l’essentiel et un exemple. Retrouvez la suite du cours et les points à retenir, puis passez à l’entraînement guidé dans votre compte.
- Les formules et les repères à retenir
- Les erreurs fréquentes expliquées
- Un exercice avec des aides et sa correction
L’accès gratuit comprend les cours et exercices de votre niveau choisi.
Sources
- BO spécial n°1 du 22 janvier 2019 — programme de spécialité numérique et sciences informatiques de première générale, annexe (https://cache.media.education.gouv.fr/file/SP1-MEN-22-1-2019/26/8/spe633_annexe_1063268.pdf) — rubrique « Algorithmique », parcours séquentiel d'un tableau, tris par insertion et par sélection
- BO spécial n°8 du 25 juillet 2019 — programme de spécialité numérique et sciences informatiques de terminale générale, annexe (https://eduscol.education.fr/document/30010/download) — rubrique « Algorithmique », introduction
- T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein, Algorithmique (Introduction to Algorithms), 3e édition française, Dunod — chapitres 2 et 3, analyse des algorithmes et croissance des fonctions
Vous pensez avoir trouvé une erreur dans cette leçon ? Signalez-la par e-mail.