Suffixbaum und Versuche. Was ist der Unterschied?

80

Ich lese über Triesallgemein als Präfixbäume und Suffix Trees.
Obwohl ich Code für a gefunden Triehabe, kann ich kein Beispiel für a finden Suffix Tree. Ich habe auch das Gefühl, dass der Code, der a erstellt, Trieder gleiche ist wie der für a, Suffix Treemit dem einzigen Unterschied, dass wir im ersteren Fall Präfixe speichern, im letzteren jedoch Suffixe.
Ist das wahr? Kann mir jemand helfen, das in meinem Kopf zu klären? Ein Beispielcode wäre eine große Hilfe!

Cratylus
quelle
1
TL; DR Der Suffixbaum eines Strings ist eine Patricia Trie aller seiner Suffixe. Das einzig Besondere daran ist, dass die Kantenbeschriftungen Teilzeichenfolgen der ursprünglichen Zeichenfolge sind, sodass sie als Paar von Indizes dargestellt werden können und nur konstanten Platz beanspruchen. Dies ist auch der Grund, warum es in linearer Zeit gebaut werden kann.
Niklas B.

Antworten:

66

Ein Suffixbaum kann als Datenstruktur angesehen werden, die auf einem Trie aufgebaut ist. Statt nur die Zeichenfolge selbst in die Trie einzufügen, würden Sie auch jedes mögliche Suffix dieser Zeichenfolge hinzufügen. Wenn Sie beispielsweise die String- Banane in einem Suffix-Baum indizieren möchten, erstellen Sie einen Trie mit den folgenden Strings:

banana
anana
nana
ana
na
a

Sobald dies erledigt ist, können Sie nach einem beliebigen n-Gramm suchen und prüfen, ob es in Ihrer indizierten Zeichenfolge vorhanden ist. Mit anderen Worten, die n-Gramm-Suche ist eine Präfixsuche aller möglichen Suffixe Ihrer Zeichenfolge.

Dies ist der einfachste und langsamste Weg, einen Suffixbaum zu erstellen. Es stellt sich heraus, dass es viele schickere Varianten dieser Datenstruktur gibt, die entweder den Raum oder die Bauzeit verbessern. Ich bin in diesem Bereich nicht gut genug versiert, um einen Überblick zu geben, aber Sie können zunächst Suffix-Arrays oder erweiterte Datenstrukturen dieser Klasse untersuchen (Vorlesung 16 und 18).

Diese Antwort macht auch einen wunderbaren Job und erklärt eine Variante dieser Datenstruktur.

Ze Blob
quelle
Dies ist, was ich vermutet habe. Der Versuch wird verwendet, um den Suffixbaum zu erstellen, und deshalb bieten die meisten Lehrbücher nur Code für Versuche. Aber dies ist die Implementierung im schlimmsten Fall, oder?
Cratylus
@ Kratylus-Suffixbäume sind am nützlichsten bei sehr großen Zeichenfolgen (z. B. Indizierung aller Werke von Shakespeare), bei denen O (n ^ 2) -Raum und Bauzeit es einfach nicht schneiden werden. Glücklicherweise können diese Grenzen erheblich gesenkt werden.
Ze Blob
8

Wenn Sie sich einen Trie vorstellen, in den Sie die Suffixe eines Wortes einfügen, können Sie ihn sehr einfach nach den Teilzeichenfolgen des Strings abfragen. Dies ist die Hauptidee hinter dem Suffixbaum, es ist im Grunde ein "Suffix-Versuch".

Bei Verwendung dieses naiven Ansatzes wäre das Erstellen dieses Baums für eine Zeichenfolge der Größe n O (n ^ 2) und würde viel Speicherplatz beanspruchen.

Da alle Einträge dieses Baums Suffixe derselben Zeichenfolge sind, teilen sie viele Informationen, sodass es optimierte Algorithmen gibt, mit denen Sie sie effizienter erstellen können. Mit dem Ukkonen-Algorithmus können Sie beispielsweise online einen Suffixbaum in O (n) -Zeitkomplexität erstellen.

Juan Lopes
quelle
2
Sie sagen also, Suffixbäume und Suffixversuche sind gleich?
Batman
1

Der Unterschied ist sehr einfach. Ein Suffixbaum hat weniger "Dummy" -Knoten als das Suffix trie. Diese Dummy-Knoten sind einzelne Zeichen, die die Suchoperation im Baum erhöhen

neugierig
quelle
0

Tries Knoten haben Links zu einem kürzeren Kontext, 'Tree' hat ihn nicht. Wenn die Knoten von Tree eine Verknüpfung zu einem kürzeren Kontext erhalten, wird Trie; o)

Stephan Banev
quelle