Adloun

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

Exercice suivant et tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →