Subsecuencia repetida (dispersa) más larga en una cadena


26

Declaración informal del problema:

Dada una cadena, por ejemplo, ACCABBAB , queremos colorear algunas letras rojas y algunas letras azules (y algunas no en absoluto), de modo que leer solo las letras rojas de izquierda a derecha arroje el mismo resultado que leer solo las letras azules.

En el ejemplo podríamos colorearlos así: ACCABBAB

Por lo tanto, decimos CAB es una subsecuencia repetida de ACCABBAB . También es una subsecuencia repetida más larga (que es fácil de verificar).

¿Podemos calcular subsecuencias repetidas más largas de manera eficiente?

Pregunta formal

¿Es NP-difícil decidir por una cadena y algo de k , si existe una subsecuencia repetida de longitud k en la cadena?

  • Si es así: ¿Qué problema puede reducirse a este problema?
  • Si no: ¿Qué es un algoritmo eficiente? (obviamente, este algoritmo se puede usar para calcular una subsecuencia repetida más larga)

Pregunta extra:

¿Será siempre una subsecuencia repetida de longitud n/2o(n) si el tamaño del alfabeto está limitado por una constante?

(Se sabe que esto es cierto para los alfabetos binarios).

Edición 2: La respuesta negativa a la pregunta de bonificación ya se conoce para alfabetos de tamaño mínimo de 5 . De hecho, para alfabetos de tamaño , hay cadenas con subsecuencias repetidas más largas de una longitud meramente . Cadenas aleatorias son suficientes para mostrar esto. El resultado ya existía, pero lo pasé por alto. O ( n · Σ - 1 / 2 )ΣO(n·Σ1/2)

Editar: Nota:

Algunas personas quieren decir "subcadena" cuando dicen "subsecuencia". Yo no. Este no es el problema de encontrar una subcadena dos veces.


Sekti, gracias. Tienes razón: mi primer comentario fue erróneo; Ahora lo he eliminado. Por otro lado, mi comentario restante está hablando de subsecuencias no contiguas. Si es fijo, hay una manera de resolver su problema (con subsecuencias no contiguas, con el mandato de no superponerse) en el tiempo o menos. Cada subproblema dp realiza un seguimiento de los índices de todas las letras rojas y todas las letras azules elegidas hasta ahora. Esto probablemente no sea interesante, porque no nos dice qué sucede cuando es parte de la entrada. O ( n 2 k + 2 ) kkO(n2k+2)k
DW

@DW ¿Por qué no se puede responder eficientemente a la pregunta formal con esta modificación de la subsecuencia común más larga? Quizás me falta algo y alguien puede aclararme.
Bryce Kille

@BryceKille, no lo sé; Tal vez puede. Si descubres cómo hacerlo, ¡espero que escribas una respuesta!
DW

Respuestas:


-2

Esto se puede resolver en tiempo polinomialconstruyendo un gráfico donde cada nodo representa un punto en alguna subsecuencia repetida de tal que . El borde entre los nodos y significa que puede continuarse por para formar una subsecuencia repetida de longitud 2.( i , j ) S S [ i ] = S [ j ] u v u vG(i,j)SS[i]=S[j]uvuv

1. Encuentra los nodos. Esto se puede hacer en tiempo construyendo una lista ordenada de índices para cada carácter , y luego enumerando los pares únicos. No hay más de nodos.c m = n 2O(n2)cm=n2

2. Encuentra los bordes. A lleva tiempo verificar si el nodo puede continuar con el nodo , por lo que al considerar todos los pares este paso lleva tiempo .u v ( u , v ) O ( m 2 )O(1)uv(u,v)O(m2)

3. Tenga en cuenta que la ruta más larga en puede no ser una subsecuencia repetida válida. Considere los caminos y . Si existe un borde entonces es una subsecuencia repetida válida de longitud 3. Por lo tanto, toma tiempo para encontrar todas las subsecuencias repetidas de longitud 3. En el caso general, se necesita tiempo lineal para verificar si dos rutas válidas de longitud se puede combinar en una ruta válida de longitud .a b b c a c a b c O ( m 4 ) n n + 1GabbcacabcO(m4)nn+1

4. Itere el paso 3 hasta que ya no se puedan encontrar caminos.


Hmm Muy rápido. En el paso 3, el número de subsecuencias a considerar se hace cada vez más grande. Entonces no es polinomial.
noplogist

1
¡Bienvenido a CS.SE y gracias por intentar resolver este problema! Me temo que no entiendo su algoritmo. ¿Qué es el paso 3? Todo lo que veo en "3." son algunas declaraciones / observaciones declarativas, pero no veo una especificación de procedimiento de lo que se supone que debe hacer el algoritmo. Además, no veo lo que significa repetir el Paso 3, o la justificación de su afirmación de que el tiempo suficiente. Su comentario posterior hace que parezca que ya no cree que su respuesta es correcta. Si es así, podría ser mejor eliminar la respuesta, para evitar confusiones. O(nnm2)
DW

Siempre puede recuperar o publicar una nueva respuesta si descubre la respuesta más tarde.
DW

DW, gracias. La entrada al paso 3 son todas las subsecuencias repetidas de longitud n, y la salida son todas las subsecuencias repetidas de longitud n + 1. Creo que el algoritmo es correcto, pero que no es un algoritmo de tiempo polinómico. Ahora he marcado las afirmaciones que considero incorrectas.
noplogist

Gracias. Entiendo. Desafortunadamente, con esas revisiones, me temo que esta respuesta no responde la pregunta que se hizo. La pregunta era: ¿es NP-hard? ¿Hay un algoritmo eficiente? Mostrar que existe un algoritmo de tiempo exponencial no ayuda a responder ninguna de esas preguntas. De hecho, ya es trivial ver que hay un algoritmo de tiempo exponencial para el problema, sin invocar ninguna técnica sofisticada. Agradezco tu intento.
DW
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.