AccueilđŸ‡«đŸ‡·Chercher

Plus longue sous-suite strictement croissante

La recherche d'une plus longue sous-suite strictement croissante dans une suite finie est un problĂšme classique en algorithmique. Ce problĂšme peut ĂȘtre rĂ©solu en temps O(n log n) avec n la longueur de la suite.

Description

L'entrĂ©e du problĂšme est une suite finie x1, ..., xn. De façon formelle, l'objectif est de trouver une sous-suite strictement croissante de la suite , Ă©tant une fonction strictement croissante ⟩1, L⟧ → ⟩1, n⟧, pour la plus grande longueur L possible[1].

Par exemple, la suite (6, 1, 4, 9, 5, 11) possÚde des sous-suites strictement croissantes de longueur 4, mais aucune de longueur 5. Une plus longue sous-suite strictement croissante est (1, 4, 9, 11), obtenue en prenant les éléments en position 2, 3, 4 et 6 de la suite initiale. En général, la solution n'est pas unique. Ici, une autre solution est (1, 4, 5, 11).

Ce problÚme est parfois désigné par l'acronyme LIS, pour longest increasing subsequence.

Algorithme

L'algorithme de programmation dynamique suivant résout le problÚme de la plus longue sous-suite croissante en temps quasi linéaire O(n log n). Il utilise seulement des tableaux et une fonction de recherche dichotomique. Il traite les éléments de la suite dans l'ordre, en gardant en mémoire la plus longue sous-suite strictement croissante trouvée jusqu'à présent et d'autres sous-suites plus courtes mais dont le dernier élément est plus petit (donc potentiellement plus faciles à compléter avec les éléments suivants). Les éléments de la suite sont notés X[1], X[2], ..., X[N]. AprÚs avoir traité X[i], les invariants suivants sont vérifiés :

  • M[j] contient une position k telle que X[k] soit la plus petite valeur possible du dernier Ă©lĂ©ment d'une sous-suite strictement croissante de X[1], ..., X[i] ayant exactement j Ă©lĂ©ments.
  • P[k] contient l'indice du prĂ©dĂ©cesseur de X[k] dans une plus longue sous-suite strictement croissante se terminant en position k.

L'algorithme conserve dans une variable L la longueur de la plus longue sous-suite strictement croissante trouvée.

À tout moment, la suite X[M[1]], X[M[2]], ..., X[M[L]] est croissante. En effet, s'il existe une sous-suite strictement croissante de longueur i>1 se terminant en position M[i], alors il existe une sous-suite strictement croissante de longueur i-1 se terminant par une valeur infĂ©rieure. Comme la suite est croissante, il est possible de faire une recherche dichotomique dans cette suite. Attention : en gĂ©nĂ©ral, la suite d'indices M[1], M[2], ..., M[L] n'est pas croissante, donc X[M[1]], X[M[2]], ..., X[M[L]] n'est pas une sous-suite de X[1], ..., X[L] (donc pas une solution du problĂšme).

Description de l'algorithme :

Entrée : X, un tableau indicé de 1 à n.
Sortie : L, longueur de la plus longue sous-suite strictement croissante de X.
         P, tableau de prédécesseurs permettant de reconstruire explicitement la suite.
P = tableau indicé de 1 à n
M = tableau indicé de 0 à n
L = 0
M[0] = 0
pour i = 1, 2, ..., n :
   par recherche dichotomique, trouver le plus grand entier j tel que 1 ≀ j ≀ L
     et X[M[j]] < X[i] ou définir j = 0 s'il n'en existe aucun.
   P[i] = M[j]
   si j == L ou X[i] < X[M[j + 1]] :
      M[j + 1] = i
      L = max(L, j + 1)

Les Ă©lĂ©ments de la sous-suite peuvent ĂȘtre calculĂ©s en partant du dernier Ă©lĂ©ment X[M[L]], puis en remontant dans le tableau P des prĂ©dĂ©cesseurs : l'avant-dernier Ă©lĂ©ment est X[P[M[L]]], l'antĂ©pĂ©nultiĂšme est X[P[P[M[L]]]], etc.

À chaque tour de boucle, l'opĂ©ration la plus coĂ»teuse est la recherche dichotomique, de complexitĂ© O(log n). Le temps total d'exĂ©cution de l'algorithme est donc O(n log n).

Liens avec la plus longue sous-séquence commune

Le problĂšme de la plus longue sous-suite croissante est liĂ© Ă  celui de la plus longue sous-suite commune Ă  deux suites, pour lequel il existe un algorithme de rĂ©solution par programmation dynamique de complexitĂ© quadratique : pourvu que l'alphabet sur lequel sont dĂ©finies les chaĂźnes soit muni d'une relation d'ordre, la plus longue sous-suite croissante d'une suite S est la plus longue sous-suite commune Ă  S et T, oĂč T est obtenue en triant S.

Inversement, le problĂšme de la plus longue sous-suite commune Ă  deux suites S[1], S[2], ..., S[n] et T[1], T[2], ..., T[m] peut ĂȘtre rĂ©duit au problĂšme de la plus longue sous-suite croissante. Pour cela, on note A[x] la liste des indices des Ă©lĂ©ments de S valant x par ordre dĂ©croissant. Si i[1], i[2], ..., i[k] est une plus longue sous-suite strictement croissante de la suite obtenue en concatĂ©nant A[T[1]], ..., A[T[m]], alors S[i[1]], ..., S[i[k]] est une plus longue sous-suite commune Ă  S et T. La taille de la suite obtenue par concatĂ©nation est au plus nm, mais seulement m si la premiĂšre suite ne contient pas d'Ă©lĂ©ment en double. Ainsi, la rĂ©duction donne une mĂ©thode de rĂ©solution du problĂšme de la plus longue sous-suite commune relativement efficace dans des cas particuliers courants[2].

Plus longue sous-suite strictement croissante d'une permutation

DĂ©finition

On note par le groupe symĂ©trique de permutations de ⟩1, n⟧. Soit une permutation, on identifie la plus longue suite croissante de la permutation avec la plus longue sous suite croissante de et soit sa longueur. prĂ©sente Ă©galement le nombre de piles dans le Patience sorting[3].

ThéorÚme de Baik-Deift-Johansson[4]

Soit un entier non nul et la mesure de Haar (probabilité uniforme) sur alors pour tout réel

ou est la fonction cumulative de la distribution de Tracy-widom pour .

Notes et références

(en) Cet article est partiellement ou en totalitĂ© issu de l’article de WikipĂ©dia en anglais intitulĂ© « Longest increasing subsequence » (voir la liste des auteurs).
  1. (en) Craige Schensted, « Longest increasing and decreasing subsequences », Canadian Journal of Mathematics, vol. 13,‎ , p. 179-191 (DOI 10.4153/CJM-1961-015-3, MR 0121305).
  2. (en) Dan Gusfield, Algorithms on Strings, Trees, and Sequences : Computer Science and Computational Biology, Cambridge University Press, , 534 p. (ISBN 978-0-521-58519-4, lire en ligne), « Refining Core String Edits and Alignments », p. 290-292.
  3. « American Mathematical Society » (DOI 10.1090/s0273-0979-99-00796-x, consulté le )
  4. « American Mathematical Society » (DOI 10.1090/s0894-0347-99-00307-0, consulté le )

Voir aussi

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.