Trouver le motif répété le plus long dans une chaîne

9

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, 142857142857c'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?

Juho
la source
3
Vous n'avez pas défini ce que « deux ou trois fois » signifie, si « deux fois » compte comme « deux ou trois fois » , puis 142857est pas la plus longue parce 142857142857est plus. Je pense que vous devriez modifier la question pour clarifier ce que vous entendez par «motif répété».
Tsuyoshi Ito
très bon point. Je mettrai à jour la question.
8
Souhaitez-vous que les occurrences du motif soient disjointes les unes des autres? Parce que sinon, 142857142857 n'est toujours pas la plus longue répétition; 142857142857142857142 se produit deux fois. Dans tous les cas, la réponse habituelle à des questions comme celle-ci est «arbres de suffixes».

Réponses:

15

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 temps O(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ù k2 et X est un préfixe propre de w . Le plus grand carré contenu dans cette répétition est (wk/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.

Yuval Filmus
la source