Wir wissen, dass die längste gemeinsame Teilzeichenfolge zweier Zeichenfolgen in der zeitlichen Komplexität von ist. Kann eine Lösung nur in linearer Zeit gefunden werden?
quelle
Wir wissen, dass die längste gemeinsame Teilzeichenfolge zweier Zeichenfolgen in der zeitlichen Komplexität von ist. Kann eine Lösung nur in linearer Zeit gefunden werden?
Sei und die Länge zweier gegebener Strings,
Ja, der längste gemeinsame Teilstring zweier gegebener Zeichenfolgen kann in -Zeit gefunden werden, vorausgesetzt, die Größe des Alphabets ist konstant.
Hier ist ein Auszug aus einem Wikipedia-Artikel über das längste häufig auftretende Teilzeichenfolgenproblem .
Die längsten gemeinsamen Teilzeichenfolgen einer Reihe von Zeichenfolgen können gefunden werden, indem ein verallgemeinerter Suffixbaum für die Zeichenfolgen erstellt und dann die tiefsten internen Knoten gefunden werden, die Blattknoten aus allen Zeichenfolgen im Teilbaum darunter enthalten.
Das Erstellen eines verallgemeinerten Suffixbaums für zwei gegebene Zeichenfolgen benötigt Zeit unter Verwendung des berühmten genialen Ukkonen-Algorithmus . Das Finden der tiefsten internen Knoten, die von beiden Zeichenfolgen stammen, benötigt Zeit. Daher können wir den längsten gemeinsamen Teilstring in Zeit finden.
Eine funktionierende Implementierung finden Sie unter Suffix Tree Application 5 - Längste gemeinsame Teilzeichenfolge bei GeeksforGeeks
Tatsächlich kann die längste gemeinsame Teilzeichenfolge zweier gegebener Zeichenfolgen unabhängig von der Größe des Alphabets in werden.
Hier ist die Zusammenfassung der Berechnung der längsten gebräuchlichen Teilzeichenfolgen über Suffix-Arrays von Babenko, Maxim & Starikovskaya, Tatiana. (2008).
Bei einer Menge von Zeichenfolgen der Gesamtlänge über Alphabet kann man fragen, für jede die längste Teilzeichenfolge , die zumindest erscheint in Strings in . Es ist bekannt, dass dieses Problem in -Zeit mit Hilfe von Suffixbäumen gelöst werden kann . Der resultierende Algorithmus ist jedoch ziemlich kompliziert (insbesondere beinhaltet er die Beantwortung bestimmter am wenigsten verbreiteter Vorfahrenabfragen in -Zeit). Auch die Laufzeit und der Speicherverbrauch können von abhängen .
Dieses Papier präsentiert einen alternativen, bemerkenswert einfachen Ansatz für das obige Problem, der auf dem Begriff der Suffix-Arrays beruht. Sobald das Suffix-Array eines zusätzlichen -Längenstrings berechnet ist, benötigt man eine einfache -Zeit-Nachbearbeitung, um den angeforderten längsten Teilstring zu finden. Da kürzlich eine Reihe effizienter und einfacher linearer Zeitalgorithmen zum Erstellen von Suffix-Arrays entwickelt wurde (wobei die Konstante nicht von abhängt ), scheint unser Ansatz recht praktisch zu sein.
Hier ist die allgemeine Idee des Algorithmus im obigen Artikel. String sei die Verkettung aller mit getrennten Sentinels. Konstruieren Sie das Suffix-Array für sowie das Array mit dem längsten gemeinsamen Präfix . Wenden Sie eine Schiebefenstertechnik auf diese Arrays an, um die längsten gemeinsamen Teilzeichenfolgen zu erhalten.
Ja. Es gibt sogar einen Wikipedia-Artikel darüber! https://en.wikipedia.org/wiki/Longest_common_substring_problem
Insbesondere gibt es, wie Wikipedia erklärt, einen linearen Zeitalgorithmus, der Suffixbäume (oder Suffixarrays) verwendet.
Die Suche nach "längster gemeinsamer Teilzeichenfolge" zeigt diesen Wikipedia-Artikel als ersten Treffer (für mich). Bitte recherchieren Sie in Zukunft das Problem, bevor Sie hier nachfragen. (Siehe z . B. https://meta.stackoverflow.com/q/261592/781723 .)