ioCode

Distance d'édition

Programmation dynamique • Cours-TP 2A

L'objectif de l'exercice est de calculer la distance d'édition (distance de Levenshtein) entre deux chaînes de caractères, c'est-à-dire le nombre minimal d'opérations (insertion, suppression, substitution) nécessaires pour transformer une chaîne en l'autre, en explorant trois approches de plus en plus optimisées.

Soit a et b deux chaînes de caractères. On note |a| le cardinal de a, c'est-à-dire le nombre de caractères de la chaîne. a[−1] désigne le dernier caractère de la chaîne a. On dénote par a[:−1] la chaîne a tronquée de son dernier caractère.

On suppose que :

  • supprimer un caractère,
  • insérer un caractère,
  • et substituer un caractère,

sont des opérations qui ont toute un coût unitaire (1). Si le caractère est identique, la substitution ne coûte rien (0).

La distance d'édition est définie par induction de la manière suivante :

de(a,b)={max⁡(|a|,|b|)si min⁡(|a|,|b|)=0de(a[:−1],b[:−1])si a[−1]=b[−1]1+min⁡{de(a[:−1],b)de(a,b[:−1])de(a[:−1],b[:−1])sinon 

Exemple : Distance d'édition (Levenshtein) Øvoilier Øolivier 234567 1123456 2222345 3333234 4343334 5444445 6555544 7666654 0 1 1 2 2 3 3 3 3 Distance de Levenshtein = 3 Le chemin tracé indique les opérations requises : 1. Les diagonales (↘) sont des substitutions y compris lettres identiques. 2. Insertion (→) 3. Suppression (↓)

  1. Programmation dynamique ascendante : Écrire une fonction impérative de(a, b) qui renvoie la distance d'édition entre les deux chaînes a et b en complétant un tableau 2D à la bonne dimension. Par exemple de("kitten", "sitting") renvoie 3.

  2. Récursion sans mémoïsation : Écrire une fonction récursive rec_de(a, b) qui renvoie la distance d'édition. Par exemple rec_de("kitten", "sitting") renvoie `3.

  3. Récursion avec mémoïsation : Écrire une fonction récursive avec mémoïsation mem_de(a, b, mem) qui renvoie la distance d'édition, en utilisant le dictionnaire mem (clef : le tuple (a, b)) pour stocker et réutiliser les résultats déjà calculés. Par exemple mem_de("kitten", "sitting", {}) renvoie 3.

Langage
Console initialisée. En attente de l'interpréteur...