Adloun

Six boucles, six ordres de grandeur

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 3 — Algorithmes, programmes et complexité

Énoncé

Pour chacun de ces fragments, donner le nombre exact d'exécutions de compte++ en fonction de , puis l'ordre de grandeur.


/* a */ for (int i = 0; i < n; i++) for (int j = 0; j < i; j++) compte++;
/* b */ for (int i = 1; i < n; i = 2 * i) compte++;
/* c */ for (int i = 0; i < n; i++) compte++;
        for (int j = 0; j < n; j++) compte++;
/* d */ for (int i = 0; i < n; i++) for (int j = 0; j < 10; j++) compte++;
/* e */ for (int i = 1; i * i <= n; i++) compte++;
/* f */ for (int i = 1; i < n; i = 2 * i) for (int j = 0; j < n; j++) compte++;

Corrigé

Nombre exactOrdre
a
b
c
d
e
f

Les quatre colonnes de droite sont mesurées : le compteur a été exécuté. C'est le seul moyen sûr de vérifier une formule qu'on vient d'écrire, et il coûte trois minutes.

Trois remarques qui valent pour tout le livre.

(a) contre (c) : deux boucles imbriquées multiplient, deux boucles successives additionnent. La confusion est la première faute de comptage, et elle se règle en regardant l'indentation.

(c) contre (d) : et sont tous deux . La constante qui les sépare est parfaitement réelle — le programme (d) fait cinq fois plus de travail — et elle est pourtant absente de l'ordre de grandeur. C'est le prix du : il ne compare que des familles de courbes. L'exercice 3.9 montre ce que ce prix coûte quand on l'oublie.

(b) : la borne n'est pas incrémentée mais doublée. C'est la signature du logarithme, et on la reconnaît à l'{œ}il : si est multiplié par une constante à chaque tour, le nombre de tours est logarithmique. Symétriquement, en (e), croît linéairement mais la borne porte sur : le nombre de tours est en racine.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.