Frage

Ich suche nach einem Hochleistungsalgorithmus, um zu prüfen, ob ich eine bestimmte Zeichenfolge mit einem bestimmten Satz von Substrings rekonstruieren kann. Weitere Details:

Angenommen, unsere Saiten befinden sich über das Alphabet $ \ Sigma $ .

Eingänge :

    .
  • a string $ s \ in \ sigma ^ * $
  • ein endlicher Satz von Saiten $ a={A_1, A_2, ..., A_n \ \ Subset \ Sigma ^ * $ .

Ausgang :

    .
  • Ob $ \ existiert M: \ existiert B_1, B_2, \ LDOTs, B_M \ in A: B_1 + B_2 + \ CDS + B_M= S $ .

wobei $ + $ String-Verkettung ist.

Beispielsweise, wenn $ s= {} $ " $ ABCD $ " und $ a={$ " $ AB $ " $, $ < / span> " $ CD $ " $, $ " $ AC $ " $ \} $ , die Antwort ist true. Nehmen Sie zum Zwecke dieser Frage an, dass Saiten in $ A $ bei Bedarf mehrmals wiederverwendet werden können.

War es hilfreich?

Lösung

Wenn die Zeichenfolgen in $ A $ erlaubt ist, können Sie es mit der dynamischen Programmierung lösen: Erste, speichern Sie den Saiten in $ A $ in einem Präfixbaum (nur ein umgekehrter Suffix-Baum link ) und rekursiv, wenn $ s [i: ende] $ aus $ A $ erstellt werden kann: $ \ ell $ Seien Sie die Länge der Zeichenfolge, und Wlog nimmt an, $ s $ wird von $ \ $$ und $ a \ bekommt A \ Cup \ {\ $ \} $ . Moroever, lass $ m [i] \ in \ {· 0,1 \} $ angeben, ob $ s [i: \ ell] $ kann von Elementen in $ A $ erstellt werden. Initialisieren Sie $ M [I] \ Get \ Infty $ für $ i= 0, \ Punkte, \ ell-1 $ < / span> und $ m [\ ell]= 1 $ (weil $ s [\ \ tig]=$$ < / span>). Nun, nun angenommen, $ f (i) $ ist die Funktion, die rekursiv berechnet, $ m [i] $ wenn Es wurde bereits bereits berechnet. Wenn $ F (i) $ aufgerufen wird, beginnen Sie an der Wurzel des Suffix-Baums von $ A $ , und Traverse $ s [i], s [i + 1], \ dots $ auf dem Suffix Tree bis Index $ J $ , so dass der entsprechende Knoten in $ A $ ist, und rekursiv anrufen $ f (j) $ . Wenn Returns $ 1 $ , set $ m [i]= 1 $ und return $ 1 $ . Wiederholen Sie ansonsten den Prozess mit dem Durchlauf von $ S [J + 1], S [J + 2], \ Punkte $ , bis ein anderes Mitglied in $ A $ oder ein Blatt ist erreicht. Wenn es keinen Erfolg gab, set $ m [i]= 0 $ und return $ 0 $ . Um das Problem zu entscheiden, rufen Sie an, um $ F (1) $ . Die Worst-Case-Komplexität ist die Komplexität ist $ \ ell d $ , mit $ D $ Tiefe der Suffix Tree (längste Reihenfolge in $ A $ ) sowie die Baukosten des Präfixbaums.

Das Worst-Case-Szenario wird in vielen Fällen vermieden, da die rekursive Anrufsuche stoppt, sobald eine Lösung gefunden wird. In der Praxis kann der $ \ \ ell d $ teils viel weniger sein. Die Konstruktion des Suffixbaums kann je nach $ A $ teuer sein. Wenn jedoch $ A $ für mehrere Saiten verwendet wird $ S $ , werden die Kosten amortisiert. Wenn $ A $ wirklich groß ist und $ s $ ist, ist es möglicherweise besser, Elemente zu sortieren von $ A $ und tue eine binäre Suche anstelle von Traversal.

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