Adloun

algorithmique (école d'ingénieur) · Chapitre 8 · Application directe du cours

Distance d'édition

Séquences et chaînes de caractères · niveau 3 (difficile)

Énoncé

La distance d'édition (de Levenshtein) entre et est le nombre minimum d'opérations pour transformer en , chaque opération étant l'insertion, la suppression ou le remplacement d'un symbole. Par exemple, chat devient champ en insérant m puis en remplaçant t par p.

  • On note la distance entre les - et -préfixes de et . Donner et .
  • Supposons le problème résolu et regardons le traitement des derniers symboles. Montrer que si , et sinon

  • Écrire le programme qui calcule la distance et affiche une suite d'opérations optimale. Donner sa complexité.
  • Calculer et .

Corrigé

  • Transformer un -préfixe en la chaîne vide demande suppressions : . De même (insertions).
  • Dans une transformation optimale, le dernier symbole est soit supprimé (il reste à transformer en : ), soit placé en face de (gratuitement s'ils sont égaux, par un remplacement sinon : ou ), soit est inséré (). Si , les placer en face est toujours au moins aussi bon, d'où la formule.
  • Calcul du tableau puis reconstruction à rebours, en retrouvant quel cas a donné le minimum :

static int[][] calculerE(String T, String U) {
    int m = T.length(), n = U.length();
    int[][] E = new int[m + 1][n + 1];
    for (int p = 0; p < m + 1; p++) E[p][0] = p;          // base : p suppressions
    for (int q = 0; q < n + 1; q++) E[0][q] = q;          // base : q insertions
    for (int p = 1; p < m + 1; p++)
        for (int q = 1; q < n + 1; q++)
            if (T.charAt(p - 1) == U.charAt(q - 1)) E[p][q] = E[p - 1][q - 1];
            else E[p][q] = 1 + Math.min(E[p - 1][q - 1], Math.min(E[p - 1][q], E[p][q - 1]));
    return E;
}
static void operations(String T, String U, int[][] E, int p, int q) {
    if (p == 0 && q == 0) return;
    if (p > 0 && q > 0 && T.charAt(p - 1) == U.charAt(q - 1) && E[p][q] == E[p - 1][q - 1]) {
        operations(T, U, E, p - 1, q - 1);                // symbole conservé
    } else if (p > 0 && q > 0 && E[p][q] == E[p - 1][q - 1] + 1) {
        operations(T, U, E, p - 1, q - 1);
        System.out.println("  remplacer " + T.charAt(p - 1) + " par " + U.charAt(q - 1));
    } else if (p > 0 && E[p][q] == E[p - 1][q] + 1) {
        operations(T, U, E, p - 1, q);
        System.out.println("  supprimer " + T.charAt(p - 1));
    } else {
        operations(T, U, E, p, q - 1);
        System.out.println("  insérer " + U.charAt(q - 1));
    }
}

Le calcul est en , la reconstruction en .

  • Exécution :

e(chat, champ) = 2
  insérer m
  remplacer t par p
e(algorithme, logarithme) = 3
  remplacer a par l
  remplacer l par o
  remplacer o par a

nom : T
valeurs : c h a _ t
indices : non
colorier : 3 4

nom : U
valeurs : c h a m p
indices : non
colorier : 3 4
legende : distance 2

nom : T
valeurs : a l g o r i t h m e
indices : non
colorier : 0 1 3

nom : U
valeurs : l o g a r i t h m e
indices : non
colorier : 0 1 3
legende : trois remplacements : distance 3

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 →