Adloun

Probleme – Le compteur binaire, et son coût amorti

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

Énoncé

On incrémente un compteur binaire de bits, initialement nul, fois de suite. Le coût d'une incrémentation est le nombre de bits qu'elle fait basculer.

Corrigé

1. L'incrémentation.


/* Incremente le compteur binaire c[0..k-1] (c[0] est le bit de poids
   faible). Renvoie false en cas de debordement.
   Precondition : chaque c[i] vaut 0 ou 1. */
bool incrementer(int c[], int k) {
    int i = 0;
    /* INVARIANT : les bits c[0..i-1] valaient tous 1 et ont ete mis a 0. */
    while (i < k && c[i] == 1) { c[i] = 0; i = i + 1; }
    if (i == k) { return false; }        /* le compteur etait 11...1 */
    c[i] = 1;
    return true;
}

Pire cas d'un appel : le compteur vaut sur ses bits utiles, et l'incrémentation les bascule tous, plus un : . Mesuré : le incrément, qui passe de à , coûte basculements.

2. Le coût total, par comptage par bit. Ne comptons pas par incrémentation, mais par bit — c'est le retournement qui fait tout le problème.

Le total vaut donc

Le coût amorti d'une incrémentation est donc , c'est-à-dire — alors que le pire cas d'un appel isolé est .

3. La mesure, et la formule exacte.


      n | basculements | 2n - s2(n) | basculements/n
      1 |            1 |          1 | 1,0000
      2 |            3 |          3 | 1,5000
      4 |            7 |          7 | 1,7500
     16 |           31 |         31 | 1,9375
    100 |          197 |        197 | 1,9700
   1000 |         1994 |       1994 | 1,9940
  10000 |        19995 |      19995 | 1,9995
1000000 |      1999993 |    1999993 | 2,0000

La valeur exacte est , où est le nombre de dans l'écriture binaire de — la mesure la confirme sur les huit lignes. Le rapport monte vers sans jamais l'atteindre : la borne est fine, et elle est stricte.

ImportantPourquoi cet exemple, plutôt que le tableau qui double

Les deux illustrent le coût amorti, mais celui-ci est plus honnête sur un point : il n'y a aucune allocation, aucune recopie, aucun qui sortirait d'un choix d'implémentation. Le facteur vient de la seule série géométrique , c'est-à-dire de la structure de la numération binaire. C'est le même argument que pour le tableau dynamique, réduit à son squelette.

Et la garantie est du même type : aucune hypothèse sur les entrées. Il n'y a d'ailleurs pas d'entrée — le compteur ne fait que compter. On ne peut pas construire une « mauvaise suite d'incrémentations » : c'est la différence entre l'amorti et le cas moyen, rendue évidente.

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.