Aller au contenu principal

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 262144

Quand 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 10

Pourquoi 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
20

Bloc 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.

  1. Deux boucles imbriquées : la boucle intérieure fait i tours, pour i allant de 0 à n − 1.
  2. Au total : 0 + 1 + … + (n − 1) = n(n − 1)/2 passages, de l'ordre de n².
  3. Contrôle par l'exécution : quand n double, le nombre de passages est presque multiplié par quatre.
4950 19900 79800

Le 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

Tableau : Classe, Forme typique, n = 64, n = 128, Quand n double
ClasseForme typiquen = 64n = 128Quand n double
Constantaucune boucle, ou boucle fixe range(10)1010inchangé
Logarithmiquewhile qui divise n par 267+ 1 étape
Linéaireune boucle sur n éléments64128× 2
Quadratiquedeux boucles imbriquées de n tours4 09616 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.

Explorer les autres cours

Accès rapide