Wie finde ich die größte Sequenz in einer Zeichenfolge, die mindestens einmal wiederholt wird?

9

Versuchen, das folgende Problem zu lösen:

  

Geben Sie für eine Zeichenfolge beliebiger Länge die längste Teilzeichenfolge an, die mehr als einmal in der Zeichenfolge ohne Überlappungen vorkommt.

Beispiel: Wenn die Eingabezeichenfolge ABCABCAB lautet, lautet die korrekte Ausgabe ABC . Sie könnten nicht ABCAB sagen, weil das nur zweimal auftritt, wenn die beiden Teilzeichenfolgen sich überlappen, was nicht erlaubt ist.

Gibt es eine Möglichkeit, dies für Strings mit ein paar tausend Zeichen schnell zu lösen?

(Und bevor jemand fragt, dies sind keine Hausaufgaben. Ich suche nach Möglichkeiten, das Rendern von Lindenmayer-Fraktalen zu optimieren, weil sie dazu neigen, mit einem naiven Turtle-Graphik-System übermäßig viel Zeit für das Zeichnen in hohen Iterationsstufen zu nehmen. )

    
Mason Wheeler 07.08.2012, 20:30
quelle

4 Antworten

3

Hier ist ein Beispiel für eine Zeichenfolge der Länge 11, die Sie verallgemeinern können

  • Setzen Sie die Chunk-Länge auf den Boden (11/2) = 5

  • Scannt die Zeichenkette in Blöcken von 5 Zeichen, die bis zur Suche nach Wiederholungen übrig sind. Es wird 3 Vergleiche geben

%Vor%
  • Wenn Sie ein Duplikat gefunden haben, sind Sie fertig. Andernfalls reduzieren Sie die Chunk-Länge auf 4 und wiederholen Sie, bis die Chunk-Länge auf Null geht.

Hier ist ein (offensichtlich ungetesteter) Pseudocode:

%Vor%

Es kann ein Fehler "von Eins nach Eins" sein, aber der Ansatz sollte vernünftig (und minimal) sein.

    
Jim Garrison 07.08.2012 20:53
quelle
2

Es sieht aus wie ein Suffix-Baum-Problem. Erstellen Sie den Suffixbaum, und suchen Sie dann den größten komprimierten Zweig mit mehreren untergeordneten Elementen (tritt mehrmals in der ursprünglichen Zeichenfolge auf). Die Anzahl der Buchstaben in diesem komprimierten Zweig sollte der Größe der größten Teilsequenz entsprechen.

Ich habe etwas Ähnliches hier gefunden: Ссылка

Sieht so aus, als könnte es in O (n) gemacht werden.

    
piotrek 07.08.2012 20:52
quelle
0

Zuerst müssen wir das Startsymbol unserer Teilkette definieren und die Länge definieren. Iteriere alle möglichen Startpositionen und ermittle dann die Länge der binären Suche nach der Länge (wenn du substr mit der Länge a findest, kannst du mit der längeren Länge eine monotone Funktion finden, so dass die bin-Suche in Ordnung sein sollte). Dann finden Sie gleiche Teilstring ist N, mit KMP oder Rabin-Karp jeder lineare Algo ist in Ordnung. Gesamt N * N * log (N). Ist das zu viel Komplexität? Der Code ist etwas wie:

%Vor%

Macht Sinn?

    
Roman Dzhabarov 07.08.2012 20:39
quelle
0

Diese Art der Analyse wird oft in Genomsequenzen durchgeführt. schau dir dieses Papier an. Es hat eine effiziente Implementierung (C ++) zum Lösen von Wiederholungen: Ссылка könnte das sein, was du suchst

    
dr.mo 21.05.2013 15:00
quelle