Adloun

informatique (MP2I/MPI) · Chapitre 3 · Exercice de TD

Problème — Le compteur binaire, et son coût amorti

Algorithmes, programmes et complexité · niveau 3 (difficile)

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

  • Écrire l'incrémentation, et donner le coût d'un appel dans le pire cas.
  • Montrer que le coût total de incrémentations est , et en déduire le coût amorti.
  • Vérifier la borne par la mesure, et donner la valeur exacte du total.

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 bit bascule à chaque incrémentation : fois.
  • Le bit ne bascule qu'une incrémentation sur deux : fois.
  • Plus généralement, le bit bascule fois.

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.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre