Permutation circulaire lexicographiquement minimale
En informatique, et notamment en algoritmique du texte la permutation circulaire lexicographiquement minimale d'une chaîne de caractères est la permutation circulaire d'une chaîne de caractères qui, pour un ordre ordre lexicographique donné, est la permutation minimale parmi toutes les permutations circulaires.
Par exemple, la permutation circulaire minimale de est . La permutation circulaire minimale permet une représentation normalisée des chaînes. Elle facilite la vérification de l'égalité des chaînes circulaires[1].
Algorithmes
L'algorithme naïf
L'algorithme naïf pour trouver la permutation circulaire lexicographique minimale d'une chaîne consiste à parcourir les permutations successives tout en gardant une trace de la permutation lexicographique la plus minimale rencontrée. Si la chaîne est de longueur n, cet algorithme s'exécute en O(n2) temps dans le pire des cas.
L'algorithme de Booth
Un algorithme efficace a été proposé par Booth en 1980[2]. L'algorithme utilise une fonction de prétraitement modifiée de celle employée dans l'algorithme de Knuth-Morris-Pratt. La fonction d'échec de la chaîne est calculée normalement, mais la chaîne est permutée circulairement pendant le calcul, de sorte que certains indices doivent être calculés plus d'une fois lors de la rotation. La permutation lexicographique minimale est obtenue à la fin du calcul et l'indice de départ est renvoyé. La démonstration de l'exactitude de l’algorithme est un peu difficile à comprendre, mais sa mise en œuvre est facile. Voici une implémentation en python :
.
def least_rotation(s: str) -> int:
  n = len(s)
  f = [-1] * (2 * n)
  k = 0
  for j in range(1, 2 * n):
    i = f[j - k - 1]
    while i != -1 and s[j % n] != s[(k + i + 1) % n]:
      if s[j % n] < s[(k + i + 1) % n]:
        k = j - i - 1
      i = f[i]
    if i == -1 and s[j % n] != s[(k + i + 1) % n]:
      if s[j % n] < s[(k + i + 1) % n]:
        k = j
      f[j - k] = -1
    else:
      f[j - k] = i + 1
  return k
La suppression des lignes de code qui modifient la valeur de k donne la fonction de prétraitement de Knuth-Morris-Pratt d'origine, car le nombre k qui représentant le décalage de la rotation reste constamment nul. L'algorithme de Booth opère en temps pour une chaîne de longueur . L'algorithme effectue au plus et nécessite une mémoire auxiliaire de longueur .
L'algorithme de canonisation rapide de Shiloach
Shiloach (1981)[3] a proposé en 1981 un algorithme améliorant le résultat de Booth en termes de performance. Il observe que s'il existe q permutation circulaires lexicographiquement minimales équivalentes d'une chaîne de longueur n, alors la chaîneest constituée de q sous-chaînes égales de longueur . L'algorithme ne nécessite que comparaisons et espace constant dans le pire des cas.
L'algorithme est divisé en deux phases. Dans la première phase, un criblage rapide élimine les indices qui ne sont manifestement pas des indices de départ pour la permutation circulaire lexicographique minimale. La deuxième phase détermine ensuite l'indice de début de rotation lexicographiquement minimale à partir des indices restants.
Algorithme de factorisation de Lyndon de Duval
Duval (1983)[4] a donné un algorithme efficace qui factorise la chaîne en ses facteurs qui sont des mots de Lyndon. L'algorithme s'exécute en temps linéaire avec place en mémoire constante.
Variantes
Shiloach (1979)[5] a proposé un algorithme permettant de tester efficacement l'égalité de deux chaînes circulaires sans normalisation. Une application supplémentaire qui découle de l’algorithme est la génération rapide de certaines structures chimiques sans répétitions.
Voir aussi
Références
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Lexicographically minimal string rotation » (voir la liste des auteurs).
- ↑ Kellogg S. Booth et Charles J. Colbourn, « Linear Time Automorphism Algorithms for Trees, Interval Graphs, and Planar Graphs », SIAM Journal on Computing, vol. 10, no 1, , p. 203–225 (DOI 10.1137/0210015, lire en ligne)
- ↑ Kellogg S. Booth, « Lexicographically least circular substrings », Information Processing Letters, vol. 10, , p. 240–242 (DOI 10.1016/0020-0190(80)90149-0)
- ↑ Yossi Shiloach, « Fast canonization of circular strings », Journal of Algorithms, vol. 2, , p. 107–121 (DOI 10.1016/0196-6774(81)90013-4)
- ↑ Jean Pierre Duval, « Factorizing words over an ordered alphabet », Journal of Algorithms, Elsevier, vol. 8, , p. 363–381 (ISSN 0196-6774, DOI 10.1016/0196-6774(83)90017-2)
- ↑ Yossi Shiloach, « A fast equivalence-checking algorithm for circular lists », Information Processing Letters, vol. 8, , p. 236–238 (DOI 10.1016/0020-0190(79)90114-5)
- Portail des mathématiques
- Portail de l'informatique théorique