Angesichts einer Liste von Saiten, finden Sie alle Paare (x, y) $, in der $ x $ eine Ansprüche von $ y $ ist.Möglich, besser als $ o (n ^ 2) $ zu tun?

cs.stackexchange https://cs.stackexchange.com/questions/121670

Frage

Betrachten Sie das folgende algorithmische Problem: Angesichts einer Liste der Saiten $ l= [S_1, S_2, \ DOTS, S_N] $ , möchten wir alle Paare kennen < Span-Klasse="Math-Container"> $ (x, y) $ Wobei $ x $ eine andere $ y $ . Wir können davon ausgehen, dass alle Saiten in der Länge von maximal $ M $ sind, wobei $ M << N $ und sind alle über ein endliches Alphabet $ \ Sigma $ mit $ | \ Sigma | << n $ . Wir können auch davon ausgehen, dass die Anzahl der Paare $ (x, y) $ wo $ x $ a ist Die Ansprüche von $ y $ ist viel kleiner als $ n $ .

Ein trivialer Algorithmus wäre dies:

generasacodicetagpre.

Dies hat jedoch die Komplexität $ O (n ^ 2 \ cdot m) $ - Ich bin neugierig, ob es einen schnelleren Algorithmus gibt (schneller Anzahl der Paare $ (x, y) $ ist viel kleiner als $ n $ , so dass zum Beispiel ein Algorithmus mit Komplexität in Abhängigkeit von der Anzahl der Ausgangspaare).

Note Hinweis -X-IS-A-Substring-of-Y "> Diese Frage , das ungefähr das gleiche Problem ist, aber für Teilzeichenfolgen (keine Ansprüche). Dort löste der Aho-CoraSick-Algorithmus mein Problem perfekt - gibt es vielleicht so etwas, aber für die Ansprüche?

War es hilfreich?

Lösung

Nein, es ist nicht möglich, besser zu sein, es sei denn, die starken exponentiellen Zeithypothese (Seth) schlägt nicht. Wenn wir dieses Problem wesentlich schneller lösen könnten als $ O (N ^ 2) $ Wir würden sofort einen viel schnelleren Algorithmus erhalten, um die NP-vollständige Problemzufriedenheit zu lösen. Dies gilt auch für $ M $ etwas mehr als $ \ log (n) $ und der Fall in was wir entscheiden möchten, ob ein solcher Paar $ (x, y) $ überhaupt vorhanden ist.

siehe, zB diese Vorlesungsnotizen unter § 3 " Untere Grenzen für orthogonale Vektoren ". Der Beweis ist analog zum Nachweis der Theorem 2 in diesen Vortragshinweisen.

Erstens berücksichtigen wir das allgemeinere Problem, dass zwei Sätze von Saiten $ x, y $ und findet, ob ein gewisser Zeichenfolge in $ X $ ist eine Ansprüche einer Zeichenfolge in $ y $ .

Angesichts einer SAT-Formel teilen wir den $ N $ Variablen in zwei gleiche Sätze von $ n / 2 $ auf < / span> Variablen. In $ \ Sigma $ nehmen wir einen Charakter, der jeder Klausel entspricht. In $ x $ Fügen wir für jede mögliche Zuordnung in die erste Hälfte der Variablen eine Zeichenfolge hinzu, mit einem Zeichen, das jeder Klausel nicht erfüllt ist, nicht erfüllt von diesen Variablen. In der Zwischenzeit, in $ y $ , fügen wir eine Zeichenfolge für jede Aufgabe in der zweiten Hälfte der Variablen hinzu, mit einem Zeichen für jede von diesen Variablen erfüllte Klausel. Die Formel ist eindeutig erfüllt, wenn und nur, wenn einige Zeichenfolge in $ x $ eine andere Zeichenfolge in $ y $ ist .

Wenn dieses Problem wesentlich schneller gelöst werden kann als $ O (N ^ 2) $ , ergibt dies einen wesentlich schnelleren Algorithmus für Ergiebigkeit als $ 2 ^ n $ . Angenommen, das Problem könnte in $ O (n ^ {1.99}) $ Zeit gelöst werden, dann könnte die Erfüllungsfähigkeit in $ gelöst werden (2 ^ {n / 2}) ^ {1.99}= o (2 ^ {0.996n}) $ das widerspricht Seth.

In Ihrem Problem gibt es nur einen einzigen Set von Saiten, der alle eine Ansprüche voneinander sein können. Dies ist jedoch kein Problem, da wir die Saiten einfach in unserem Fall ändern können, so dass keine Zeichenfolge $ y $ eine andere andere Zeichenfolge ist (zum Beispiel durch Polsterung Alle Saiten in $ y $ , um dieselbe Länge zu haben), und in ähnlicher Weise jede Zeichenfolge in $ x $ auf die gleiche Länge wie andere Saiten in $ x $ (aber wesentlich kürzer als Zeichenfolgen in $ y $ ) .

Dies kann wahrscheinlich auch mit einem konstanten (wahrscheinlich auch binären) Alphabet erfolgen, dies erfordert jedoch mehr clevere Kodierungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top