2012-06-12 17 views
12

Il problema di sottostringa comune più lungo secondo wiki può essere risolto utilizzando un albero di suffisso.
Da wiki:Come trovare la sottostringa comune più lunga usando gli alberi?

Le lunghe stringhe comuni di un insieme di stringhe possono essere trovati da costruzione di un albero suffisso generalizzato per le corde, e poi trovare più profondi nodi interni che hanno nodi foglia da tutte le stringhe nella sottostruttura di sotto di essa

non ottengo questo.
Esempio: se devo:
ABCDE e XABCZ
poi l'albero suffisso è (alcuni rami da XABCZ omessi per motivi di spazio):
enter image description here

La più lunga sottostringa comune è ABC ma non è che posso non vedere come la descrizione di wiki aiuta qui.
ABC non è il nodo interno più profondo con nodi foglia.
Qualche aiuto per capire come funziona?

+0

'ABC non è il nodo interno più profondo con nodi foglia. No, ma ABC * è * la più lunga * comune * stringa di nodi in qualsiasi punto dell'albero. I successivi più lunghi sono 'B-C' e' D-E', con due nodi ciascuno. –

+0

Sì 'ABC' è la stringa più lunga comune. Ma non capisco come la descrizione del wiki possa effettivamente aiutarmi a trovarlo a livello di programmazione – Cratylus

+4

Devi leggere l'altro Wiki: http://en.wikipedia.org/wiki/Generalised_suffix_tree. Probabilmente ci sono delle risorse migliori (più facilmente comprensibili) [qui] (https://www.google.com/search?q=generalized+suffix+tree). Vedi anche http: // StackOverflow.it/questions/969448/generalised-suffix-tree-java-implementation –

risposta

4

Non hai effettivamente disegnato l'albero del suffisso. Se lo avessi fatto correttamente, alla radice avresti solo un personaggio possibile una volta. L'albero si divide solo quando una singola lettera può avere più suffissi successivi. Ciò costringe insieme sottostringhe comuni nell'albero, che le rende rintracciabili.

+0

Non sono sicuro di seguirti qui. Se la stringa era: 'ABCDBEF' allora ci sarebbe un sub-incantesimo sotto' B' per 'BCDBEF' e' BEF' ma per questo esempio, ad esempio 'ABCDE', non avremo un ramo per ogni suffisso possibile? – Cratylus

+0

Nel diagramma di esempio che hai fornito, dovrebbe esserci al massimo un figlio della radice con l'etichetta "A". Dovresti aver unito questi due nodi. –

+0

@LouisWasserman: Davvero? Perché? 'A' è un prefisso in' ABCDE'. Perché dovrebbe esserci un nodo figlio di root che è 'A'? – Cratylus

7

Come quello che è stato detto prima, il tuo albero non è corretto.

Questo è ciò che ottengo eseguendo "ABCDE $ XABCZ" tramite il mio codice.

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 un (compatto) albero suffisso, è necessario trovare il nodo interno più profondo (s) che hanno nodi foglia di tutte le stringhe. Se hai più nodi alla stessa profondità, devi confrontare la lunghezza della stringa rappresentata da quel nodo. cioè ABC, BC e C hanno tutti la stessa profondità, quindi è necessario confrontare la lunghezza delle stringhe ABC, BC e C per vedere quale è più lungo; che è ovviamente 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 un (non compatto) albero dei suffissi, trovare il nodo interno più profondo (s) che hanno nodi foglia di tutte le stringhe.

Spero che aiuti.

+1

È un albero di suffisso "compresso"? Anche quali sono i numeri, ad es. '(20)' o '(24)' ecc.? – Cratylus

+0

Sì, questo è compresso, ma il collasso significa la fusione ad es. "DE" in un singolo nodo. Tutti gli alberi di suffisso, tuttavia, combinano "CDE $" e "CZ $" in un nodo "C" con un ramo "DE $" e un ramo "Z $" - ma un albero di suffisso collassato tratterà "DE $" come un nodo e un albero di suffisso non interrotto tratterebbe "DE $" come tre nodi, uno per ciascun carattere. –

+0

@ user384706 Sì, è un albero collassato. I numeri sono solo identificatori di nodo, niente da notare. Ho anche creato un suffisso Trie, se sei interessato. L'ho aggiunto alla risposta. – Justin

Problemi correlati