informatique (MP2I/MPI) · Chapitre 6 · Exercice de TD
Problème — Choisir d'après le profil des opérations
Types et structures de données abstraites · niveau 3 (difficile)
Énoncé
Deux applications manipulent entiers.
- A insère fois en tête, puis lit fois par indice.
- B insère fois en fin, puis lit fois par indice.
- Prévoir, pour chaque application, le coût total avec un tableau puis avec une chaîne de maillons.
- Mesurer.
- Quelle règle générale en tirer, et quel piège la règle cache-t-elle ?
Corrigé
1. La prévision. On note .
| Tableau | Chaîne | |
|---|---|---|
| A : insertions en tête | (décalage) | |
| lectures par indice | chacune | chacune |
| Total A | ||
| B : insertions en fin | avec pointeur de queue | |
| lectures par indice | chacune | chacune |
| Total B |
Les deux profils sont exactement inverses : chacun est quadratique pour une structure et linéaire pour l'autre.
2. La mesure, en C, sans optimisation :
A : tableau 1,063 s chaine 0,003 s rapport : 350
B : tableau 0,0001 s chaine 1,451 s rapport : 14 500
La prévision est confirmée dans les deux sens. Et les rapports mesurés collent au compte d'opérations : pour A, le tableau fait déplacements contre pour la chaîne, soit un rapport prédit de pour mesurés ; pour B, la chaîne fait pas de parcours contre accès pour le tableau, soit prédits pour mesurés.
3. La règle, et son piège. La règle est celle du chapitre : si l'on accède par indice, tableau ; si l'on insère et supprime en tête, maillons.
Le piège qu'elle cache est qu'on ne l'applique pas au bon niveau. Ce qui décide n'est pas l'opération la plus visible dans le code, c'est celle qui est répétée le plus souvent — et les deux ne coïncident pas. Dans l'application A, la lecture par indice apparaît dans le programme au même titre que l'insertion ; elle n'a lieu que fois contre , et c'est cela qui tranche. Une structure ne se choisit pas sur la liste des opérations, mais sur leur profil, c'est-à-dire leurs nombres relatifs.
Deux corollaires pratiques.
- Il faut compter avant de choisir, et le comptage se fait sur le cas d'usage réel, pas sur l'intention. Si l'on ne sait pas compter, on mesure — c'est ce que l'on vient de faire.
- Le profil peut changer en cours de vie. Une structure remplie une fois puis lue mille fois n'a pas le même profil pendant les deux phases : on construit alors avec une chaîne, et l'on convertit en tableau avant la phase de lecture. Le coût de la conversion, , est amorti dès la première dizaine de lectures.
Et l'on remarquera que rien de tout cela n'a demandé de changer l'algorithme : c'est le point de départ du chapitre, et sa conclusion.
Exercices semblables
- Trier une chaîne ne rend pas la recherche logarithmique corrigé
- Écrire un contrat avant toute réalisation corrigé
- L'invariant que seule l'abstraction protège corrigé
- Problème — Mutable ou persistant : une pile qu'on peut annuler corrigé
- Problème — Un ensemble d'entiers, trois réalisations, un critère corrigé