Séquences et chaînes de caractères
Cours · algorithmique (école d'ingénieur), chapitre 8 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
Objectifs du chapitre
- Raisonner sur les préfixes d'une séquence pour obtenir une récurrence.
- Calculer une plus longue sous-séquence commune à deux séquences (plsc), base de l'outil
diffet de la bioinformatique. - Segmenter une chaîne de caractères en mots d'un dictionnaire.
- Raisonner sur des sous-chaînes et calculer par tailles croissantes : plus longue sous-séquence palindrome.
Une séquence est une suite finie de symboles : une chaîne de caractères, un brin d'ADN (symboles A, C, G, T), un fichier vu comme une suite de lignes… Les problèmes de ce chapitre ont un point commun : les sous-problèmes naturels portent sur les préfixes des séquences. Le -préfixe de est ; le -préfixe est la séquence vide, le -préfixe est elle-même.
En Java, on représente les séquences par des chaînes (String) :
S.length()est la longueur de la chaîne ;S.charAt(i)est le caractère d'indice ;S.substring(i,j)est la sous-chaîne ; en particulierS.substring(0,p)est le -préfixe ;S1 + S2est la concaténation :"bon" + "jour"vaut"bonjour".
8.1 Plus longue sous-séquence commune
Une sous-séquence de est obtenue en supprimant de un nombre quelconque de symboles (entre et ), sans changer l'ordre des symboles restants. Une séquence commune (sc) à et est une sous-séquence de qui est aussi une sous-séquence de . On cherche une plus longue séquence commune (plsc).
- est une plsc à et .
- est une plsc à et .
Attention : une sous-séquence n'est pas une sous-chaîne, ses symboles ne sont pas forcément contigus.
Repère historique : diff et l'ADN
Le calcul d'une plsc est un problème de base en bioinformatique : comparer deux séquences d'ADN ou d'ARN, c'est d'abord trouver ce qu'elles ont en commun. C'est aussi le cœur de la commande diff des systèmes Unix et Linux (et donc de git diff) : chaque ligne d'un fichier est un symbole, diff calcule une plsc aux deux fichiers puis affiche les lignes qui n'en font pas partie.
L'énumération exhaustive est hors de question : une séquence de longueur a sous-séquences.
8.1.1 Supposons le problème résolu
Soient et de longueurs et , et une plsc à et , de longueur . Regardons les derniers symboles et . Il n'y a que quatre possibilités :
- . On peut toujours supposer que ce symbole commun termine (sinon, l'ajouter à la fin d'une plsc des préfixes donnerait une sc plus longue). Le reste de est une plsc à et : .
- et aucun des deux n'est le dernier symbole de : est une plsc aux deux séquences privées de leur dernier symbole, .
- et n'est pas le dernier symbole de : on peut retirer de sans rien perdre, . (Et ? Peu importe : il peut être, ou ne pas être, le dernier symbole de .)
- et n'est pas le dernier symbole de : symétriquement, .
Si les derniers symboles sont différents, l'un des deux au moins n'est pas le dernier symbole de : on est dans le cas B, C ou D, et . Or une sc aux préfixes et est aussi une sc à et : . Le cas B est donc inutile, et il reste deux cas.
On généralise aux - et -préfixes : est la longueur d'une plsc à et . Si l'un des préfixes est vide, la seule sc est la séquence vide.
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.