Plus longue sous-chaîne commune

Cet article est une ébauche concernant l’informatique.

Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants.

Page d’aide sur l’homonymie

Ne doit pas être confondu avec plus longue sous-séquence commune.

En informatique, le problème de la plus longue sous-chaîne commune, à ne pas confondre avec celui de la plus longue sous-séquence commune, consiste à déterminer la (ou les) plus longue(s) chaîne(s) consécutives de caractères qui est sous-chaîne de deux chaînes de caractères. Ce problème se généralise à la recherche de la plus longue sous-chaîne commune à plus de deux chaînes de caractères.

Exemple

La plus longue sous-chaîne commune à « ABABC », « BABCA » et « ABCBA » est la chaîne « ABC » de longueur 3. Les autres sous-chaînes communes telles que « AB », « BC » et « BA » sont plus courtes.

  ABABC
    |||
   BABCA
    |||
    ABCBA

Formalisation du problème

Étant donné deux chaînes, S {\displaystyle S} de longueur n {\displaystyle n} et T {\displaystyle T} de longueur m {\displaystyle m} , trouver la plus longue chaîne étant en même temps sous-chaîne de S {\displaystyle S} et T {\displaystyle T} . Par définition la longueur de la plus longue sous-chaîne est comprise entre 0 {\displaystyle 0} (vocabulaires disjoint) et m a x ( n , m ) {\displaystyle max(n,m)} ( S = T {\displaystyle S=T} ).

Algorithmes

Il est possible de déterminer la longueur et la position de départ de la plus longue sous-chaîne de S {\displaystyle S} et T {\displaystyle T} en Θ ( n + m ) {\displaystyle \Theta (n+m)} à l'aide d'un arbre des suffixes généralisé (en). L'algorithme naïf faisant appel à la programmation dynamique est beaucoup plus coûteux en temps : Θ ( n m ) {\displaystyle \Theta (nm)} .

Arbre des suffixes

Arbre des suffixes généralisé construit à partir des chaînes « ABAB », « BABA » et « ABBA », numérotées respectivement 0, 1 et 2.

La plus longue chaîne commune à un ensemble de chaînes peut être déterminée en construisant l'arbre des suffixes généralisé puis en trouvant le nœud le plus profond ayant des feuilles pointant vers toutes les chaînes. Dans l'exemple ci-contre, le nœud auquel on arrive par « AB » a quatre feuilles dans son sous-arbre ; la feuille de gauche dit qu'une occurrence de la sous-chaîne « AB » commence en position 2 dans la chaîne 0 (« ABAB »), de même, la feuille de droite indique une occurrence débutant en position 0 dans la chaîne 2 (« ABBA ») ; des deux feuilles centrales, celle de gauche indique qu'une occurrence de la sous-chaîne « ABA » commence en position 1 dans la chaîne 1 (« BABA »).

La construction de l'arbre des suffixes a une complexité en temps de Θ ( N ) {\displaystyle \Theta (N)} , où N {\displaystyle N} est la somme des longueur des chaînes représentées.

La recherche peut se faire en temps similaire grâce à des algorithmes de plus petit ancêtre commun[1].

Programmation dynamique

Dans un premier temps, on cherche le plus long suffixe commun pour chaque paire de préfixes des deux chaînes S {\displaystyle S} et T {\displaystyle T} . Le plus long suffixe commun du préfixe S [ 1 , p ] {\displaystyle S[1,p]} de longueur p {\displaystyle p} de S {\displaystyle S} et du préfixe T [ 1 , q ] {\displaystyle T[1,q]} de longueur q {\displaystyle q} de T {\displaystyle T} est

P L S u f f ( S [ 1 , p ] , T [ 1 , q ] ) = { P L S u f f ( S [ 1 , p 1 ] , T [ 1 , q 1 ] ) + 1 si  S [ p ] = T [ q ] 0 sinon . {\displaystyle {\mathsf {PLSuff}}(S[1,p],T[1,q])={\begin{cases}{\mathsf {PLSuff}}(S[1,p-1],T[1,q-1])+1&{\text{si }}S[p]=T[q]\\0&{\text{sinon}}.\end{cases}}}

Pour les chaînes « ABAB » et « BABA », on obtient:

A B A B
0 0 0 0 0
B 0 0 1 0 1
A 0 1 0 2 0
B 0 0 2 0 3
A 0 1 0 3 0

Le plus grand de ces suffixes communs à tous les préfixes est la plus longue sous-chaîne commune. Dans la table, elles sont indiquées en rouge, et dans l'exemple, les deux sous-chaînes communes de longueur maximale sont « ABA » et « BAB ».

P L S C ( S , T ) = max 1 p m 1 q n P L S u f f ( S [ 1 , p ] , T [ 1 , q ] ) . {\displaystyle {\mathsf {PLSC}}(S,T)=\max _{1\leq p\leq m \atop 1\leq q\leq n}{\mathsf {PLSuff}}(S[1,p],T[1,q]).}

La méthode peut être étendue à plus de deux chaînes en ajoutant des dimensions à la table.

Notes et références

  1. (en) Dan Gusfield, Algorithms on Strings, Trees and Sequences : Computer Science and Computational Biology, Cambridge/New York/Melbourne, Cambridge University Press, , 534 p. (ISBN 0-521-58519-8, lire en ligne)

Liens externes

Sur les autres projets Wikimedia :

  • Plus longue sous-chaîne commune, sur Wikibooks
  • Dictionary of Algorithms and Data Structures: longest common substring
  • Perl/XS implementation of the dynamic programming algorithm
  • Perl/XS implementation of the suffix tree algorithm
  • Dynamic programming implementations in various languages on wikibooks
  • working AS3 implementation of the dynamic programming algorithm

Source de la traduction

  • (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Longest common substring problem » (voir la liste des auteurs).

Voir également

v · m
Algorithmique du texte
Recherche de sous-chaîne
Alignement de chaînes
Mesure de similarité
Arbre des suffixes
Comparaisons
  • icône décorative Portail de l’informatique