¿Se pueden usar los árboles de sufijo para encontrar todas las subcadenas comunes?

10

Estoy tratando de usar árboles de sufijos para comparar secuencias de cadenas. He encontrado implementaciones / teoría para el problema de subcadena común más largo usando árboles de sufijos. Sin embargo, lo que estoy buscando es una discusión del problema relacionado: "todas las subcadenas comunes". Específicamente, tengo un problema en el que primero necesito encontrar la subcadena común más larga, luego encontrar la siguiente subcadena común más larga que no incluya los índices lcs ya encontrados, y así sucesivamente hasta una longitud mínima. ¿Se puede resolver este problema construyendo el árbol de sufijos generalizados (GST) solo una vez para las dos secuencias? Sé que se puede resolver construyendo repetidamente un GST después de cada iteración de encontrar y eliminar el LCS. Pero, me pregunto si me estoy perdiendo un buen truco en el que el GST se construye solo una vez.

chet
fuente
Es una pregunta interesante. El problema es que si tenemos y hemos encontrado que β es el LCS wrt T , no podemos "eliminar" fácilmente β del árbol de sufijos (o matriz de sufijos, lo que sea). Nos gustaría tener algo como S = α $ γ después del primer paso, ¿verdad? S=αβγβTβS=α$γ
Dmytro Korduban

Respuestas:

3

Sí, los árboles de sufijos se pueden usar para encontrar todas las subcadenas comunes. Yo diría que use una matriz de sufijos, pero si ya tiene un árbol de sufijos, la construcción de una matriz de sufijos a partir de un árbol de sufijos requiere tiempo lineal por DFS. Entonces, el resto de mi respuesta supondrá que estamos trabajando con una matriz de sufijos.

Dado un texto , una matriz de sufijos para S es una matriz de enteros de rango 0 a n que especifica el orden lexicográfico de los sufijos n + 1 de la cadena S $S=s1,...,snS0nn+1S

Queremos acoplar la matriz de sufijos con , los prefijos comunes más largos. Podemos construir la matriz de L C P s en tiempo lineal como se menciona en el artículo de Kasai et al . Las matrices de sufijos y sus matrices lcp se alinean juntas de una manera que dado un índice en la matriz lcp dice l c p [ k ] donde k es el número de índice, entonces s a [ k ] será el comienzo de una instancia del común subcadena y s a [ k - 1 ]LCPsLCPslcp[k]ksa[k]sa[k1]será el índice de inicio de la segunda instancia. La longitud es, por supuesto, el valor en la matriz lcp.

mcorley
fuente
3

Tengo una idea que podría funcionar. Empezamos con un árbol de sufijos generalizado para las secuencias de y T . Cada nodo interno con sufijos de S y T en su subárbol corresponde a alguna subcadena común de las secuencias. Llamemos a estos nodos no triviales. La subcadena común es máxima, si el nodo correspondiente no tiene hijos no triviales. Si el nodo v no es trivial, almacenamos la mayor profundidad de cadena de un nodo no trivial en su subárbol como l c s ( v ) . Si r es la raíz, entonces l c s ( r )STSTvlcs(v)rlcs(r)es la longitud de la subcadena común más larga de y T .ST

Actualizar el árbol después de eliminar una subcadena de una de las secuencias no debería ser demasiado difícil. Primero eliminamos las hojas correspondientes a los sufijos eliminados, actualizando sus antepasados ​​cuando sea necesario. Luego comenzamos a procesar los sufijos que preceden a la subcadena eliminada. Sea el antepasado no trivial más bajo de la hoja actual. Si la longitud del sufijo es k (estamos a k pasos de la eliminación) yk < l c s ( v ) , tenemos que mover el sufijo a su posición correcta en el árbol, actualizando los antepasados ​​cuando sea necesario. Si k l c s ( v )vkkk<lcs(v)klcs(v), hemos terminado, ya que no estamos interesados ​​en subárboles con raíces triviales.

El algoritmo general encuentra repetidamente la subcadena común más larga de y T y elimina una de sus ocurrencias de ambas secuencias, siempre que la longitud del LCS sea lo suficientemente grande.ST

Hay algunos tecnicismos, pero la idea general debería funcionar.

Jouni Sirén
fuente
0

Comience con el texto concatenado S $ T , donde $ ocurre en ninguna parte * o T . Construya un árbol / matriz de sufijos a partir de este texto. Ahora es fácil atravesar esta estructura de datos de sufijo para recopilar todas las repeticiones máximas correctas. Al examinar el contexto izquierdo, filtre las repeticiones máximas no izquierdas. Este filtrado hacia la izquierda podría implementarse utilizando la tabla Burrows-Wheeler como en Abouelhoda et al, aunque no creo que sea necesario. Se repite solo en S o solo en Ttambién debería eliminarse en este punto. Las repeticiones que no se han eliminado se colocan en una cola de prioridad, con prioridad definida por la longitud. Después del recorrido, a medida que las repeticiones registradas se eliminan de la prioridad, se puede llevar a cabo el filtrado final (para la contención de subcadenas). Sin embargo, dado el uso de frases máximas, sospecho que muy poco de este filtrado sería necesario.

Este algoritmo es mi propio invento. No lo clasificaría como muy inteligente, pero debería funcionar.

Dale Gerdemann
fuente
0

SsTtstST

Magnus Lie Hetland
fuente