Distance d'édition
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 et deux chaînes de caractères. On note le cardinal de , c'est-à-dire le nombre de caractères de la chaîne. désigne le dernier caractère de la chaîne . On dénote par la chaîne 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 :
Exemple :
-
1IndiceCréer un tableau 2D de taille (len(a)+1)×(len(b)+1) et le remplir ligne par ligne en distinguant le cas caractères égaux (diagonale) du cas contraire (1 + min de trois directions adjacentes).
Programmation dynamique ascendante : Écrire une fonction impérative
de(a, b)qui renvoie la distance d'édition entre les deux chaînesaetben complétant un tableau 2D à la bonne dimension. Par exemplede("kitten", "sitting")renvoie3. -
2IndiceStructurer la récursion sur les premiers caractères avec un cas de base sur les chaînes vides puis, sinon, renvoyer 1 + min de trois appels sur a[1:]/b, a[1:]/b[1:] et a/b[1:].
Récursion sans mémoïsation : Écrire une fonction récursive
rec_de(a, b)qui renvoie la distance d'édition. Par exemplerec_de("kitten", "sitting")renvoie `3. -
3IndiceVérifier d'abord la présence de la clé (a, b) dans le dictionnaire mem, puis comparer les derniers caractères en tronquant avec a[:-1] et b[:-1] avant d'enregistrer le résultat.
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 dictionnairemem(clef : le tuple(a, b)) pour stocker et réutiliser les résultats déjà calculés. Par exemplemem_de("kitten", "sitting", {})renvoie3.
Console initialisée. En attente de l'interpréteur...