Gli alberi Suffix possono essere utilizzati per trovare tutte le sottostringhe comuni?


10

Sto cercando di usare gli alberi dei suffissi per confrontare le sequenze di stringhe. Ho trovato implementazioni / teoria per il più lungo problema di sottostringa comune usando alberi di suffissi. Tuttavia, quello che sto cercando è una discussione del problema correlato - "tutte le sottostringhe comuni". In particolare, ho un problema in cui devo prima trovare la sottostringa comune più lunga, quindi trovare la sottostringa comune più lunga successiva che non include gli indici lcs già trovati e così via fino a una lunghezza minima. Questo problema è risolvibile costruendo l'albero dei suffissi generalizzati (GST) solo una volta per le due sequenze. So che può essere risolto costruendo ripetutamente un GST dopo ogni iterazione di ricerca e rimozione di LCS. Ma mi chiedo se mi manca un trucco preciso in cui nel GST è costruito solo una volta.


È una domanda interessante Il problema è che se abbiamo e abbiamo scoperto che β è l'SLS wrt T , non possiamo facilmente "rimuovere" β dall'albero del suffisso (o matrice del suffisso, qualunque cosa). Vorremmo avere qualcosa come S = α $ γ dopo il primo passo, giusto? S=αβγβTβS=α$γ
Dmytro Korduban,

Risposte:


3

Sì, gli alberi di suffisso possono essere utilizzati per trovare tutte le sottostringhe comuni. Direi invece di utilizzare un array di suffissi, ma se hai già un albero di suffissi, la creazione di un array di suffissi da un albero di suffissi richiede tempo lineare da DFS. Quindi il resto della mia risposta supporrà che stiamo lavorando con un array di suffissi.

S=s1,...,snS0nn+1S

LCPsLCPslcp[k]ksa[k]sa[k1]sarà l'indice iniziale della seconda istanza. La lunghezza è ovviamente il valore nell'array lcp.


3

STSTvlcs(v)rlcs(r)ST

vkkk<lcs(v)klcs(v), abbiamo finito, in quanto non ci interessano i sottotitoli con radici banali.

ST

Ci sono alcuni tecnicismi, ma l'idea generale dovrebbe funzionare.


0

Inizia con il testo concatenato S $ T , dove $ avviene in nessuna parte * o T . Costruisci un albero / array di suffissi da questo testo. Ora è facile attraversare questa struttura di dati di suffisso per raccogliere tutte le ripetizioni massime giuste. Esaminando il contesto di sinistra, filtra le ripetizioni massime non di sinistra. Questo filtro a sinistra potrebbe essere implementato usando la tabella Burrows-Wheeler come in Abouelhoda et al, anche se non credo che ciò sia necessario. Si ripete solo in S o solo in Tdovrebbe essere eliminato anche a questo punto. Le ripetizioni che non sono state eliminate vengono quindi inserite in una coda di priorità, con priorità definita dalla lunghezza. Dopo l'attraversamento, poiché le ripetizioni registrate vengono rimosse dalla priorità, è possibile eseguire il filtraggio finale (per il contenimento della sottostringa). Dato l'uso di frasi massime, tuttavia, sospetto che sarebbe necessario molto poco di questo filtro.

Questo algoritmo è una mia invenzione. Non lo classificherei come molto intelligente, ma dovrebbe funzionare.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.