ENSIN5U1 - Algorithmique avancée
TD6 -- Plus longue sous-séquence commune
Michel Van Caneghem
4 octobre 2012
On dit d'une chaîne qu'elle est une sous-séquence d'une séquence donnée si elle est obtenue à par-
tir de cette séquence simplement en supprimant un certain nombre d'éléments de la séquence initiale
(éventuellement 0). Formellement, étant donné deux séquences X= (x1, . . . , xm)et Z= (z1, . . . , zk), on
dit que Zest une sous-séquence de Xsi il existe une suite strictement croissante d'indices (i1, . . . , ik)de
Xtel que pour tout j=1, . . . , k, on a xij=zj. Par exemple, Z= (B,C,D,B)est une sous-séquence de
X= (A,B,C,B,D,A,B), la suite d'indices correspondante étant (2, 3, 5, 7).
Attention : Ne pas confondre sous-chaine et sous-séquences : "BCDB" n'est pas une sous-chaine de X.
Etant données deux séquences X= (x1, . . . , xm)et Y= (y1, . . . , yn),le problème de la plus longue sous-
séquence commune(LCS pour Longest Common Subsequence) consiste à trouver une séquence de longueur
maximum commune à Xet Y. Nous allons voir que ce problème peut être résolu efficacement en utilisant
la programmation dynamique.
Question 1. Caractériser des sous-structures optimales pour le problème de la LCS. (Vous pourrez par
exemple considérer des problèmes de LCS sur des sous-chaines de la chaine initiale.)
Question 2 Proposer une solution récursive (i.e. écrire une formule qui donne la longueur de la LCS d'une
chaine donnée en fonction des longueurs des LCS de certaines sous-chaines de cette chaine).
Question 3. Vérifier le critère de recouvrement des sous-problèmes nécessaire pour l'utilisation de la
programmation dynamique. Pour une chaine de longueur n, combien y a-t-il de sous-problèmes potentiels.
Question 4. Proposer un algorithme qui remplit la table de programmation dynamique de façon ascen-
dante. Quel est la complexité de cet algorithme. Montrez que l'on a besoin de conserver uniquement une
ligne de cette table. Vous pouvez traiter auparavant l'exemple suivant : lcs(ACGCTG,CATGT )
Question 5. Donner un algorithme qui permet, à partir de la table remplie par l'algorithme de la question
4, de reconstruire rapidement une LCS.
Question 6. En regardant la matrice que vous avez construite, construisez un graphe et montrer que le
problème de la longueur de la lcs, peut se ramener a un problème de plus court chemein.
Distance d'édition ou distance de Levenshtein
On appelle distance de Levenshtein entre deux mots M et P le coût minimal pour aller de M à P en
effectuant les opérations élémentaires suivantes :
– substitution d'un caractère de M en un caractère de P.
– ajout dans M d'un caractère de P.
– suppression d'un caractère de M.
On associe ainsi à chacune de ces opérations un coût. Le coût est toujours égal à 1, sauf dans le cas d'une
substitution de caractères identiques. Ceci est la base de la fonction diff d'unix.
Question 7 : Quelle est la distance d'édition entre "baillonette" et "baïonnette" ?
Question 8 : Modifier la formule de récurrence et l'algorithme de la question 4 pour calculer la distance
d'édition. Appliquer cet algorithme à l'exemple précédent.
Question subsidiaire : Proposer un algorithme pour calculer la plus longue chaines communes a deux
chaines . Quelle est sa complexité.
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
1