Längste wiederholte (verstreute) Folge in einer Zeichenfolge

26

Informelle Problemstellung:

Bei einer gegebenen Zeichenfolge, z. B. , möchten wir einige Buchstaben rot und einige Buchstaben blau (und einige überhaupt nicht) färben, sodass das Lesen nur der roten Buchstaben von links nach rechts dasselbe Ergebnis ergibt wie das Lesen nur der blauen Buchstaben.ACCABBAB

Im Beispiel könnten wir sie folgendermaßen einfärben:ACCABBAB

Wir sagen daher, dass eine wiederholte Folge von ACCABBAB ist . Es ist auch eine am längsten wiederholte Folge (die leicht zu überprüfen ist).A C C A B B A BCABACCABBAB

Können wir die längsten wiederholten Teilfolgen effizient berechnen?

Formale Frage:

Ist es NP-schwer, sich für eine Zeichenkette und ein k zu entscheiden k, ob eine wiederholte Folge der Länge k in der Zeichenkette existiert?

  • Wenn ja: Welches Problem kann auf dieses Problem reduziert werden?
  • Wenn nicht: Was ist ein effizienter Algorithmus? (Natürlich kann dieser Algorithmus dann verwendet werden, um eine längste wiederholte Teilsequenz zu berechnen.)

Bonus-Frage:

Wird es immer eine wiederholte Folge der Länge wenn die Größe des Alphabets durch eine Konstante begrenzt ist?n/2o(n)

(Dies gilt bekanntermaßen für binäre Alphabete.)

Bearbeiten 2: Die negative Antwort auf die Bonusfrage ist bereits für Alphabete mit einer Größe von mindestens . Tatsächlich gibt es für Alphabete der Größe Σ Zeichenfolgen mit den längsten wiederholten Teilfolgen mit einer Länge von lediglich O (n · Σ ^ {- 1/2}) . Zufällige Zeichenfolgen genügen, um dies zu zeigen. Das Ergebnis gab es bereits, aber ich habe es übersehen.Σ O ( n · Σ - 1 / 2 )5ΣO(n·Σ1/2)

Bearbeiten: Hinweis:

Einige Leute meinen "Teilzeichenfolge", wenn sie "Teilfolge" sagen. Ich nicht. Dies ist nicht das Problem, zweimal einen Teilstring zu finden.

Sekti
quelle
Sekti, danke. Sie haben recht: Mein erster Kommentar war falsch; Ich habe es jetzt gelöscht. Auf der anderen Seite, mein restlicher Kommentar wird sprechen über nicht zusammenhängende Teilfolgen. Wenn festgelegt ist, gibt es eine Möglichkeit, Ihr Problem (mit nicht zusammenhängenden Teilsequenzen, die sich nicht überlappen dürfen) in der Zeit oder so zu lösen . Jedes dp-Teilproblem verfolgt die Indizes aller bisher ausgewählten roten und blauen Buchstaben. Dies ist wahrscheinlich uninteressant, da es uns nicht sagt, was passiert, wenn Teil der Eingabe ist. O ( n 2 k + 2 ) kkO(n2k+2)k
DW
@DW Warum kann die formale Frage mit dieser Modifikation der längsten gemeinsamen Folge nicht effizient beantwortet werden ? Vielleicht fehlt mir etwas und jemand kann das für mich klären.
Bryce Kille
@BryceKille, ich weiß es nicht; vielleicht kann es. Wenn Sie herausfinden, wie es geht, hoffe ich, dass Sie eine Antwort schreiben!
DW

Antworten:

-2

Dies kann in gelöst werden Polynomzeitdurch Konstruieren eines Graphen wobei jeder Knoten einen Punkt in einer wiederholten Folge von so dass . Kante zwischen Knoten und bedeutet, dass mit fortgesetzt werden kann , um eine wiederholte Folge der Länge 2 zu bilden.( i , j ) S S [ i ] = S [ j ] u v u vG(i,j)SS[i]=S[j]uvuv

1. Finden Sie die Knoten. Dies kann in indem für jedes Zeichen eine sortierte Liste von Indizes erstellt und anschließend die eindeutigen Paare aufgelistet werden. Es gibt nicht mehr als Knoten.c m = n 2O(n2)cm=n2

2. Finden Sie die Kanten. Es braucht Zeit, um zu prüfen, ob der Knoten durch den Knoten fortgesetzt werden kann. Wenn alle Paare berücksichtigt werden, dauert dieser Schritt Zeit.u v ( u , v ) O ( m 2 )O(1)uv(u,v)O(m2)

3. Beachten Sie, dass der längste Pfad in möglicherweise keine gültige wiederholte Teilsequenz ist. Betrachten Sie die Pfade und . Wenn es eine Kante ist eine gültige wiederholte Teilfolge der Länge 3. Daher dauert es , alle wiederholten Teilfolgen der Länge 3 zu finden. Im allgemeinen Fall dauert es linear, um zu überprüfen, ob zwei gültige Pfade vorhanden sind der Länge kann zu einem gültigen Pfad der Länge kombiniert werden .a b b c a c a b c O ( m 4 ) n n + 1GabbcacabcO(m4)nn+1

4. Wiederholen Sie Schritt 3, bis keine Pfade mehr gefunden werden.

Noplogist
quelle
Hmm. Zu schnell. In Schritt 3 wird die Anzahl der zu berücksichtigenden Teilsequenzen immer größer. Es ist also kein Polynom.
noplogist
1
Willkommen bei CS.SE und vielen Dank, dass Sie versucht haben, dieses Problem zu lösen! Ich fürchte, ich verstehe Ihren Algorithmus nicht. Was ist Schritt 3? Alles was ich in "3" sehe. sind einige aussagekräftige Aussagen / Beobachtungen, aber ich sehe keine prozedurale Spezifikation dessen, was der Algorithmus tun soll. Ich verstehe auch nicht, was es bedeutet, Schritt 3 zu wiederholen, oder die Begründung für Ihre Behauptung, dass Zeit ausreicht. Ihr nachfolgender Kommentar hört sich so an, als ob Sie nicht mehr glauben, dass Ihre Antwort korrekt ist. In diesem Fall ist es möglicherweise besser, die Antwort zu löschen, um Verwirrung zu vermeiden. O(nnm2)
DW
Sie können eine neue Antwort jederzeit wiederherstellen oder veröffentlichen, wenn Sie die Antwort später herausfinden.
DW
DW, danke. Die Eingabe in Schritt 3 besteht aus allen wiederholten Teilsequenzen der Länge n, und die Ausgabe besteht aus allen wiederholten Teilsequenzen der Länge n + 1. Ich glaube, der Algorithmus ist korrekt, aber er ist kein polynomieller Zeitalgorithmus. Ich habe jetzt die Behauptungen markiert, die ich für falsch halte.
noplogist
Vielen Dank. Ich verstehe. Leider kann diese Antwort mit diesen Überarbeitungen die gestellte Frage nicht beantworten. Die Frage war: Ist das NP-schwer? Gibt es einen effizienten Algorithmus? Zu zeigen, dass es einen Exponential-Zeit-Algorithmus gibt, hilft bei der Beantwortung dieser beiden Fragen nicht. In der Tat ist es schon trivial zu sehen, dass es einen Exponential-Zeit-Algorithmus für das Problem gibt, ohne irgendwelche ausgefallenen Techniken aufzurufen. Ich weiß Ihren Versuch zu schätzen.
DW