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