Je cherche un algorithme efficace pour trouver le motif répété le plus long dans une chaîne.
Par exemple, considérez la chaîne de nombres suivante:
5431428571428571428571428571427623874534
.
Comme vous pouvez le voir, 142857142857
c'est le modèle le plus long qui est répété plusieurs fois (au moins deux fois) dans cette chaîne.
La chaîne répétée ne doit pas contenir d'idée plutôt que de force brute?
142857
est pas la plus longue parce142857142857
est plus. Je pense que vous devriez modifier la question pour clarifier ce que vous entendez par «motif répété».Réponses:
Le problème est étonnamment non trivial. Tout d'abord, deux algorithmes de force brute. Un carré ("motif répété") est donné par sa longueurℓ et sa position p , et prend du temps O ( ℓ ) pour vérifier. Si nous passons en revue tous les ℓ et p , nous obtenons un algorithme O ( n3) . Nous pouvons améliorer cela en bouclant d'abord sur ℓ , puis en balayant la chaîne avec deux pointeurs en cours à une distance de ℓ . De cette façon, on peut vérifier si un carré de longueur 2 ℓ existe en temps linéaire, ce qui donne un temps total de fonctionnement de O ( n2) .
Kolpakov et Kucherov ont développé un algorithme pour trouver toutes les répétitions maximales dans un mot dans le tempsO ( n ) [1], et leur algorithme peut être utilisé pour trouver tous les carrés maximaux dans le temps O( n ) . Une répétition est un sous-mot de la forme wkX , où k ≥ 2 et X est un préfixe propre de w . Le plus grand carré contenu dans cette répétition est ( w⌊ k / 2 ⌋)2 . En utilisant cette formule, étant donné toutes les répétitions maximales dans un mot (dont il n'y a que O ( n ) plusieurs), on peut trouver le plus grand carré.
[1] Kolpakov, R. et Kucherov, G. (1999). Trouver des répétitions maximales dans un mot en temps linéaire . Dans Foundations of Computer Science, 1999. 40th Annual Symposium on (pp. 596-604). IEEE.
la source