Plus longue sous-séquence commune

De testwiki
Version datée du 31 mai 2023 à 06:19 par imported>WikiCleanerBot (v2.05b - Bot T3 PCS#64 - Correction syntaxique (Lien interne avec cible identique au texte - Orthographe et typographie))
(diff) ← Version précédente | Version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

Modèle:Confusion En informatique théorique, la plus longue sous-séquence commune à deux suites, ou deux chaînes de caractères, est une sous-suite extraite des deux suites, et de taille maximum. La résolution de ce problème peut être obtenue par programmation dynamique.

La généralisation à un nombre arbitraire de suites est un problème NP-difficile[1] : le temps d'exécution de tout algorithme est exponentiel en le nombre de séquences.

Exemple

Pour les deux séquences de caractères suivantes :

  • « abcde »,
  • « ceij »,

la plus longue sous-séquence commune est « ce ».

Dans ce problème, il est nécessaire que les éléments communs soient dans le même ordre dans les différentes séquences, mais pas qu’ils soient obligatoirement consécutifs : « e » n’est pas consécutif à « c » dans la première séquence.

Algorithme par force brute

On constate par dénombrement qu'il existe 2n sous-séquences pour une chaîne de longueur n. Les essayer toutes par force brute pour trouver la plus longue qui soit une sous-séquence d'une autre chaîne a donc une complexité exponentielle, ce qui n'est pas souhaitable en pratique.

Résolution en temps polynomial pour deux suites

Une telle sous-séquence peut être obtenue par un algorithme de programmation dynamique dont le temps d'exécution est proportionnel au produit des longueurs des deux séquences[2].

Structure d'une solution

Il est possible de ramener le problème de recherche de plus longue sous séquence commune (PLSC) entre deux chaînes données à une recherche entre deux chaînes de taille inférieure grâce au théorème suivant (où Xl désigne les l premiers caractères de la séquence X)[2]: Modèle:Théorème

Les trois cas xm=yn, xmyn𝖤𝖳zkxm et xmyn𝖤𝖳zkyn sont exhaustifs, ce qui permet bien de se ramener à un problème de taille inférieure.

Longueur des plus longues sous-séquences communes

On crée un tableau à deux dimensions c[1m][1n] dans lequel chaque case c[i][j] est destiné à contenir la longueur des PLSCs entre Xi et Yj. On peut alors calculer de proche en proche c[i][j] pour chaque couple d'indice i et j. Du théorème précédent découle en effet la formule[2]:

c[i][j]={0 si i=0 ou j=0,c[i1][j1]+1 si i,j>0 et xi=yj,𝗆𝖺𝗑(c[i][j1],c[i1][j]) si i,j>0 et xiyj.

Le calcul du contenu des cases de c peut être effectué avec une complexité 𝒪(mn), car le contenu de chaque case est calculable à partir des cases précédente en 𝒪(1)[2].

Obtention d'une plus longue sous-séquence commune

La formule précédente permet de calculer de proche en proche les cases de c. On peut reconstituer une plus longue sous-séquence commune grâce à lui.

Pour cela on effectue un parcours depuis c[m][n] suivant la règle suivante

Depuis une case c[i][j] de valeur α:

  • Si xi=yj, on passe à la case c[i1][j1] de valeur α1 et on ajoute ce caractère (xi=yj) au début de la PLSC en construction.
  • Si xiyj,
    • Si c[i][j1]=c[i1][j]=α, on passe indifféremment à la case c[i1][j] ou c[i][j1].
    • Si c[i][j1]=α>c[i1][j], on passe à la case c[i][j1]
    • Si c[i1][j]=α>c[i][j1], on passe à la case c[i1][j]

Un exemple de parcours est donné par le tableau suivant, grâce auquel on déduit que MJAU est une plus longue sous-séquence commune à MZJAWXU et XMJYAUZ :

0 1 2 3 4 5 6 7
Ø M Z J A W X U
0 Ø 0 0 0 0 0 0 0 0
1 X 0 0 0 0 0 0 1 1
2 M 0 1 1 1 1 1 1 1
3 J 0 1 1 2 2 2 2 2
4 Y 0 1 1 2 2 2 2 2
5 A 0 1 1 2 3 3 3 3
6 U 0 1 1 2 3 3 3 4
7 Z 0 1 2 2 3 3 3 4

Complexité de l'algorithme

Le calcul du contenu des cases de c peut être effectué avec une complexité 𝒪(mn), car le contenu de chaque case est calculable à partir des cases précédente en 𝒪(1)[2].

Une fois c connu, l'obtention d'une PLSC a une complexité 𝒪(m+n)[2].

Notes et références

Modèle:Références

Bibliographie complémentaire

Voir aussi

Modèle:Palette Algorithmes de manipulation de texte Modèle:Portail

  1. Modèle:Article
  2. 2,0 2,1 2,2 2,3 2,4 et 2,5 Modèle:Cormen2fr, chapitre 15.4, Programmation dynamique : plus longue sous-séquence commune.