Finden der längsten sich wiederholenden Teilsequenz


9

Bei einem String , würde Ich mag die längste Wiederholung (mindestens zweimal) Teilfolge zu finden. Das heißt, ich möchte einen String w finden, der eine Teilfolge (muss nicht zusammenhängend sein) von s ist, so dass w = w 'w ' . Das heißt, w ist eine Zeichenfolge, deren Hälften zweimal hintereinander erscheinen. Beachten Sie, dass w eine Teilfolge von s ist , aber nicht unbedingt eine Teilzeichenfolge.swsw=wwwws

Beispiele:

Für 'ababccabdc' ist es 'abcabc', da 'abc' = 'abc' und 'abc' (mindestens) zweimal in 'ababccabdc' vorkommen.

Für 'addbacddabcd' ist eine Option 'dddd', weil 'dd' zweimal erscheint (ich kann nicht denselben Buchstaben mehrmals verwenden, aber hier habe ich 4 'd's, also ist es in Ordnung), aber es ist lebngth 4. Ich kann eine bessere finden von Länge 8: 'abcdabcd', weil 'abcd' eine Teilzeichenfolge von 'addbacddabcd' ist, die zweimal vorkommt.

Ich bin daran interessiert, die am längsten wiederholte Folge zu finden. Dies wird auch als "Finden des längsten / größten Quadrats" bezeichnet, aber ich habe viele Artikel gelesen, in denen ein Quadrat für einen Teilstring und nicht für eine Teilsequenz definiert ist.

Ich kann leicht einen Brute-Force-Algorithmus verwenden, der durch Iteration aller Optionen für einen Haltepunkt in der Zeichenfolge benötigt, und dann habe ich zwei Zeichenfolgen, in denen ich nach der größten / längsten gemeinsamen Teilsequenz suchen werde, aber Bei jeder Prüfung wird O ( n 2 ) unter Verwendung einer dynamischen Programmiertechnik verwendet, sodass die gesamte Zeit O ( n 3 ) beträgt . Ich fand einen effizienteren Algorithmus für die längste gemeinsame Teilsequenz, der O ( n 2) nimmtO(n3)O(n2)O(n3), daher ist die LaufzeitO(n3)O(n2logn).O(n3logn)

Ich suche nach einem effizienteren Algorithmus für das am längsten wiederholte Teilsequenzproblem. Vielleicht verschwendet meine Idee, über alle Haltepunkte zu iterieren, zu viel Zeit und kann auf weniger Iterationen reduziert werden. Oder vielleicht kann ein Algorithmus mit einer anderen Einstellung dieses Problem lösen.

Ich habe in vielen Zeitschriften und früheren Fragen gesucht, und die meisten Ergebnisse, die ich gefunden habe, betrafen einen Teilstring und nicht eine Teilsequenz.

Ich habe auch gelesen, dass dies mithilfe von Suffixbäumen möglich ist, aber auch dies war für Teilzeichenfolgen relevant, und ich bin nicht sicher, ob eine solche Idee für die Teilsequenz erweitert werden kann.

O(n2)O(nlogn)


4
Suchen Sie nach Suffix-Bäumen oder Suffix-Arrays.
Pseudonym

1
o(n2)nuvxuxvxn+1$uvo(n2)xuv

O(n+m)O(nlogn)

@ Evil: Ich verstehe noch nicht wie, könntest du ein bisschen mehr Details geben? (Sind Sie sicher , dass Sie denken nicht von Longest - Common - Sub - String , der in dieser Zeit Komplexität gelöst werden kann?)
j_random_hacker

o(n2)

Antworten:


-1

Hier ist eine dynamische Programmierlösung.

x1xnT0,,nn

T[i,j]={0if i=0 or j=0,T[i1,j1]+1if xi=xj and ij,max(T[i1,j],T[i,j1])otherwise.
T[n,n]

Angenommen, wir befinden uns bei mit und die Bedingung in Ihrer Aussage ist wahr. Dies impliziert dann , dass das Zeichen an Position Teil beider Teilsequenzen ist. i,ji=j+1ifdp[i][j] = dp[i - 1][j - 1] + 1i1=j
j_random_hacker

3
Willkommen in der Informatik! Bitte entfernen Sie den Quellcode und ersetzen Sie ihn durch Ideen, Pseudocode und Argumente der Korrektheit. Siehe hier und hier für verwandte Metadiskussionen.
Raphael

@Raphael Eine rekursive Formel zählt nicht als Quellcode.
Nummer 945

1
@BreakingBenjamin Abhängig von der Sprache Ihrer Wahl können Sie die angegebene Wiederholung mehr oder weniger wörtlich aufschreiben. Der Punkt ist, dass es hier keine Erklärung gibt.
Raphael
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.