2012-06-12 16 views
12

Das längste gemeine Teilstring-Problem nach Wiki kann mit einem Suffix-Baum gelöst werden.
Von wiki:Wie finde ich den längsten gemeinsamen Teilstring mit Bäumen?

Die längste gemeinsame Teil eines Satzes von Zeichenketten kann durch Aufbau einer verallgemeinerten Suffix-Baum für die Saiten, und dann finden die tiefsten inneren Knoten gefunden werden, die Blattknoten von allen Saiten im Unterbaum darunter

Ich verstehe das nicht.
Beispiel: wenn ich:
ABCDE und XABCZ
dann wird der Suffix-Baum ist (einige Zweige von XABCZ Platzgründen weggelassen):
enter image description here

Die längsten gemeinsamen Teilzeichen ABC sind, aber es ist nicht kann ich nicht sehen, wie die Beschreibung von Wiki hier hilft.
ABC ist nicht die tiefsten internen Knoten mit Blattknoten.
Irgendwelche Hilfe, um zu verstehen, wie das funktioniert?

+0

'ABC ist nicht der tiefste interne Knoten mit Blattknoten.' Nein, aber ABC * ist * die längste * gemeinsame * Knotenfolge irgendwo im Baum. Die nächstlängsten sind 'B-C' und' D-E' mit je zwei Knoten. –

+0

Ja 'ABC' ist die längste gemeinsame Zeichenkette. Aber ich verstehe nicht, wie die Wiki-Beschreibung mir helfen würde, sie programmatisch zu finden. – Cratylus

+4

Sie müssen das andere Wiki lesen: http://en.wikipedia.org/wiki/Generalised_suffix_tree. Es gibt wahrscheinlich einige bessere (leichter verständliche) Ressourcen [hier] (https://www.google.com/search?q=generalized+suffix+tree). Siehe auch http: // stackoverflow.com/questions/969448/generalized-suffix-tree-java-implementation –

Antwort

4

Sie haben den Suffixbaum nicht gezeichnet. Hättest du es richtig gemacht, hättest du an der Wurzel nur einmal jedes mögliche Zeichen. Der Baum teilt sich nur auf, wenn ein einzelner Buchstabe mehrere folgende Suffixe haben kann. Das zwingt gemeinsame Teilstränge im Baum zusammen, was sie auffindbar macht.

+0

Ich bin mir nicht sicher, ob ich dir hier folge. Wenn die Zeichenkette "ABCDBEF" wäre, würde es unter "B" eine Unterverzweigung für "BCDBEF" und "BEF" geben, aber für dieses Beispiel, d. H. "ABCDE", wird es keine Verzweigung für jedes mögliche Suffix geben? – Cratylus

+0

In dem Beispieldiagramm, das Sie angegeben haben, sollte höchstens ein Kind der Wurzel "A" stehen. Sie sollten diese beiden Knoten zusammengeführt haben. –

+0

@LouisWasserman: Wirklich? Warum? 'A' ist ein Präfix in' ABCDE'. Warum sollte es einen Kindknoten von root geben, der 'A' ist? – Cratylus

7

Wie bereits erwähnt, ist Ihr Baum falsch.

Dies ist, was ich bekomme, wenn "ABCDE $ XABCZ" über meinen Code ausgeführt wird.

Suffix Tree code:

String = ABCDE$XABCZ$ 
End of word character 1 = $ 
└── (0) 
    ├── (20) $ 
    ├── (22) ABC 
    │ ├── (15) DE$ 
    │ └── (23) Z$ 
    ├── (24) BC 
    │ ├── (16) DE$ 
    │ └── (25) Z$ 
    ├── (26) C 
    │ ├── (17) DE$ 
    │ └── (27) Z$ 
    ├── (18) DE$ 
    ├── (19) E$ 
    ├── (21) XABCZ$ 
    └── (28) Z$ 

In einem (kompakt) Suffixbaum, müssen Sie den tiefsten inneren Knoten (n), die Blatt finden Knoten von allen Saiten haben. Wenn Sie mehrere Knoten in derselben Tiefe haben, müssen Sie die Länge der von diesem Knoten dargestellten Zeichenfolge vergleichen. d. h., ABC, BC und C haben alle die gleiche Tiefe, daher müssen Sie die Länge von ABC-, BC- und C-Strings vergleichen, um zu sehen, welche länger ist. Das ist natürlich ABC.

Suffix Trie code:

└── null 
    ├── A 
    │ └── B 
    │  └── C 
    │   ├── D 
    │   │ └── (E) ABCDE 
    │   └── (Z) ABCZ 
    ├── B 
    │ └── C 
    │  ├── D 
    │  │ └── (E) BCDE 
    │  └── (Z) BCZ 
    ├── C 
    │ ├── D 
    │ │ └── (E) CDE 
    │ └── (Z) CZ 
    ├── D 
    │ └── (E) DE 
    ├── (E) E 
    ├── X 
    │ └── A 
    │  └── B 
    │   └── C 
    │    └── (Z) XABCZ 
    └── (Z) Z 

In einer (nicht kompakt) Suffixbaum, finden Sie die tiefsten inneren Knoten (n), die Blattknoten von allen Saiten haben.

Ich hoffe, es hilft.

+1

Ist das ein "minimierter" Suffixbaum? Auch was sind die Zahlen z.B. "(20)" oder "(24)" usw.? – Cratylus

+0

Ja, das ist kollabiert, aber kollabieren bedeutet, dass z.B. "DE" in einen einzelnen Knoten. Alle Suffix-Bäume würden jedoch "CDE $" und "CZ $" zu einem "C" -Knoten mit einem "DE $" - Zweig und einem "Z $" - Zweig kombinieren - aber ein reduzierter Suffix-Baum würde "DE $" behandeln als ein Knoten und eine nicht zusammengefasste Suffixstruktur würde "DE $" als drei Knoten behandeln, einen für jedes Zeichen. –

+0

@ user384706 Ja, es ist ein zusammengebrochener Baum. Die Zahlen sind nur Knotenbezeichner, nichts zu beachten. Ich habe auch ein Suffix Trie erstellt, wenn Sie interessiert sind. Ich habe es der Antwort hinzugefügt. – Justin

Verwandte Themen