Matrices de sufijos: Dadas dos cadenas s1 y s2. ¿Cuál es el mejor algoritmo para encontrar el número de subcadenas comunes entre s1 y s2 de longitud 1, 2,… hasta min (| s1 |, | s2 |)?

Supongo que desea saber el número total de subcadenas distintas de cada longitud que se comparte.

Puede resolver este problema en tiempo lineal utilizando matrices de sufijos (como parecen sugerir los detalles de la pregunta). Primero, supongamos que ya ha calculado la matriz de sufijos de s1 + | + s2 (donde | es solo algún carácter que no está en s1 o s2) y la matriz LCP.

Ahora supongamos que queremos encontrar el número de cadenas comunes distintas de longitud m. Podemos iterar sobre la matriz de sufijos haciendo un seguimiento de si hemos visto una posición de s1 y s2. Cuando el prefijo común cae por debajo de m (o llegamos al final de la cadena) verificamos si hemos visto un sufijo de ambas cadenas y agregamos 1 si lo hemos hecho. Luego marcamos ambas cadenas como aún no vistas.

El verdadero truco es hacer esto para todas las longitudes simultáneamente. Para hacerlo, mantendremos un total acumulado (cnt1, cnt2) que indica cuántas veces hemos visto una cadena de s1 y s2 respectivamente, y una pila donde cada entrada en la pila contiene una longitud de prefijo y los valores de cnt1 y cnt2 cuando el prefijo aumentó a ese tamaño.

Ahora, comenzando con el prefijo no vacío, procesamos la matriz de sufijos. Inicializamos cnt1 y cnt2 a 0 y empujamos (len = 0, cnt1 = 0, cnt2 = 0) en nuestra pila.

Cuando procesamos un sufijo, usamos la longitud L como la longitud del prefijo común más largo del sufijo anterior (esto es lo que nos proporciona la matriz LCP) y hacemos el siguiente algoritmo.

1) Si L> = stack.top.len, vaya al paso 6

2) Almacene stack.top como (top_len, top_cnt1, top_cnt2) y luego haga estallar la pila.

3) Si top_cnt1 == cnt1 y top_cnt2 == cnt2 vaya al paso 1

4) Agregue 1 a todos los N valores en el rango [max (L, stack.top.len) + 1, top_len]

5) ve al paso 1

6) Agregue 1 a cnt1 o cnt2 según la cadena desde la que se originó el sufijo actual. Utilice una matriz de sufijo inverso para esto (es decir, mapear las indicaciones de sufijo a las indicaciones de entrada).

7) Si L! = Stack.top.len empuje (L, cnt1, cnt2) sobre la pila

Termine el algoritmo haciendo todos menos los pasos 6 y 7 para L = 0.

Es posible que haya notado que el paso 4 le pide que agregue un valor a un rango. Puede hacer esto en tiempo constante transformando N en su derivada discreta. Solo necesita agregar 1 al comienzo del rango y -1 a uno más allá del final. Luego, al final del algoritmo, puede transformarlo fácilmente en su forma adecuada.

More Interesting

¿Deberíamos memorizar algoritmos, o simplemente saber cómo implementarlos?

¿Cuánto trabaja un analista de datos / científico de datos en un día? ¿Cuánto tiempo tienes para estudiar nuevos algoritmos y técnicas?

¿Qué estructuras de datos admiten la inserción, eliminación y selección de un elemento aleatorio con un límite de complejidad de tiempo O (1) que permite duplicados?

¿Sigue siendo relevante el modelado de objetos, o se ha reemplazado hoy solo con datos y algoritmos?

Cómo escribir un algoritmo de la pila de programas usando una matriz en C

¿Cuál es el mejor libro sobre comercio algorítmico?

Un profesor me dijo que no me molestara en aprender muchos lenguajes de programación sino que me enfocara solo en C ++, estructuras de datos y algoritmos, ¿tiene razón?

¿Cómo son los problemas de programación competitiva? ¿Son problemas que afectan a la sociedad que pueden resolverse mediante algoritmos informáticos? ¿Puede dar un ejemplo?

¿Existen buenos libros o recursos para resolver problemas y algoritmos en C #, para la preparación de entrevistas SDET?

¿Cómo se programan y hacen los bots del juego (creados por jugadores) para conectarse con el juego y controlarlo?

¿Se puede utilizar el algoritmo de red neuronal artificial en un conjunto de datos dinámicos como el clima o el tráfico?

¿Qué algoritmo usas para la clasificación binaria?

¿Cómo entiende Quora la relevancia entre los feeds?

¿Necesito aprender algoritmos y estructuras de datos en la interfaz?

¿Cómo funciona el algoritmo iPod shuffle?