algorithmique (école d'ingénieur) · Chapitre 8 · Exercice de TD
Économiser la mémoire
Séquences et chaînes de caractères · niveau 2
Énoncé
On ne veut que la longueur d'une plsc, pas la plsc elle-même.
- Montrer que, pour calculer la ligne du tableau , il suffit de connaître la ligne .
- Écrire
int longueur(String T, String U)en mémoire . Quelle est sa complexité en temps ? - Pourquoi cette version ne permet-elle plus de reconstruire une plsc ?
Corrigé
- ne dépend que de , (ligne ) et (ligne , déjà calculée à gauche).
- On garde deux tableaux et on les échange après chaque ligne :
static int longueur(String T, String U) {
int m = T.length(), n = U.length();
int[] avant = new int[n + 1], ligne = new int[n + 1]; // avant = L[p-1], ligne = L[p]
for (int p = 1; p < m + 1; p++) {
ligne[0] = 0;
for (int q = 1; q < n + 1; q++)
if (T.charAt(p - 1) == U.charAt(q - 1)) ligne[q] = 1 + avant[q - 1];
else ligne[q] = Math.max(avant[q], ligne[q - 1]);
int[] x = avant; avant = ligne; ligne = x; // la ligne p devient « avant »
}
return avant[n];
}
Le temps reste , la mémoire passe de à . Sur l'exercice 8.1, on retrouve .
- La reconstruction remonte de vers et consulte des lignes déjà effacées. (Hirschberg a montré qu'on peut quand même reconstruire une plsc en mémoire , par diviser pour régner.)
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.