TP 3 : distance d’édition
Judicaël Courant
∗Le 28 mars 2016
1 Introduction
On se donne unalphabetA, c’est-à-dire un ensemble fini, par exempleA={A, T, G, C}. On appelle lettres les éléments de l’alphabet. On appelle mot sur cet alphabet une séquence finie de lettres par exemple AACGT C et longueur de ce mot le nombre de lettres dans la séquence.
On note A∗ l’ensemble des mots sur l’alphabet A. La longueur d’un motm est notée |m|. Par exemple |AACGT C|= 6. On appelle mot vide le mot de longueur0et on le note .
On appelle opération élémentaire d’édition une opération consistant à :
— insérer une lettre dans un mot (cette insertion peut se faire au début, à la fin ou à toute position arbitraire du mot) ;
— supprimer une lettre d’un mot (de même, cette suppression peut avoir lieu n’importe où) ;
— changer laie lettre d’un mot en une autre lettre (de même cette transformation peut se faire n’importe où).
On appelle distance d’édition entre deux mots x ety et on note de(x, y) le nombre minimal d’opérations élémentaires d’édition nécessaires pour transformer x eny.
de est une distance au sens où on a :
∀x, y∈ A∗ de(x, y) = 0 ⇐⇒ x=y (1)
∀x, y∈ A∗ de(x, y) =de(y, x) (2)
∀x, y, z ∈ A∗ de(x, z)≤de(x, y) +de(y, z) (3) On appelle distance de Levenshtein entre deux mots x et y la distance d`, vérifiant, pour toutes lettres aetb et tous motsx ety
d`(x, ) =|x| (4)
d`(, y) =|y| (5)
d`(xa, yb) = min(1 +d`(x, yb),1 +d`(xa, y), d`(x, y) +ca,b) (6) où ca,b vaut 0si a=bet1 sinon.
On admettra que pour tout couple de mots (x, y), d`(x, y) =de(x, y). En fait, les deux dis- tances sont souvent présentées comme une seule et même distance mais si l’inégalité de(x, y)≤ d`(x, y) se démontre facilement, démontrer l’inégalité inverse est beaucoup plus délicate.
∗cba Cette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.
1
Option informatique MPSI La Martinière Monplaisir 2015-2016
2 Travail demandé
Pour représenter les mots, on peut utiliser le type Caml string. Il est utile d’une part de savoir que s.[i] désigne le caractère numéro i de la chaîne de caractère s, et d’autre part de lire la documentation de sub_string. L’accès à un caractère d’une chaîne se fait en temps constant, le calcul d’une sous-chaîne parsub_string se fait en temps proportionnel à la chaîne de caractère résultat.
1. Réaliser une fonctiondistance1 : string -> string -> int calculant la distance d’édi- tion entre deux mots de façon récursive naïve. La tester.
2. Il est raisonnable de penser que le temps de calcul dedistance1 u vdépend des longueurs respectives des motsuetv mais pas de leurs contenus. Pourquoi ?
3. Pour (p, q) ∈ N2, on noteC(p, q) le temps de calcul de distance1 u v pour u etv des mots de longueurs respectivesp etq. Montrer
C1(p, q) =C1(p−1, q) +C1(p, q−1) +C1(p−1, q−1) + Θ(p+q) (7) 4. On peut faire un peu mieux : au lieu de représenter un motmpar une chaîne de caractère, on le représente par un couple (s, k) : string * int. Ce couple représente le mot m formé deskpremières lettres des. Pour accéder au caractère numéroide ce mot, on pourra comme précédemment utilisers.[i]. Quant au motmprivé de sa dernière lettre, on peut le représenter par (s, k−1), qui se calcule en temps constant (donc plus rapidement qu’en utilisantsub_string. On pose donc :
t y p e mot == s t r i n g * int ;;
Écrire une nouvelle fonctiondistance2 : mot -> mot -> int calculant la distance d’édi- tion entre deux mots et telle que, en notantC2(p, q) le temps de calcul de distance2 u vpour u etv de longueurs respectivespetq, on a
C2(p, q) =C2(p−1, q) +C2(p, q−1) +C2(p−1, q−1) + Θ(1) (8) 5. Montrer qu’on a alorsC2(n, n) = Ω(3n). En particulier, le temps de calcul dedistance2
u vest exponentiel en nlorsque uetv sont de longueur n.
6. Réaliser une fonctiondistance_memo : mot -> mot -> int, telle que pour deux motsuet v de longueurs respectives p etq,distance memo u v calcule la distance d’édition de u etven utilisant l’algorithme suivant :
— on crée une matrice t de taille (p+ 1)×(q+ 1) (avec des indices commençant à 0, voir la documentation du module vect) ;
— pour(i, j)∈[[0, p]]×[[0, q]], on met, danst.(i).(j), la distance deui àvj, où ui (resp.
vj) désigne le mot constitué des i(resp.j) premières lettres deu (resp. dev) ;
— on retournet.(p).(q).
7. Quelle est la complexité en temps de cette fonction ? 8. Quelle est sa complexité en mémoire ?
9. Réaliser une fonction distance_opt effectuant le même calcul, avec la même complexité en temps, mais pouvant tourner dans un espace mémoireO(min(p, q))pour le calcul de la distance de deux mots de longueurs respectivesp etq.
2