Se forma una mezcla de dos cadenas intercalando los caracteres en una nueva cadena, manteniendo los caracteres de cada cadena en orden. Por ejemplo, MISSISSIPPI
es una combinación de MISIPP
y SSISI
. Permítanme llamar a un cuadrado de cadena si es una combinación de dos cadenas idénticas. Por ejemplo, ABCABDCD
es cuadrado, porque es una combinación de ABCD
y ABCD
, pero la cadena ABCDDCBA
no es cuadrada.
¿Existe un algoritmo rápido para determinar si una cadena es cuadrada o es NP-hard? El obvio enfoque de programación dinámica no parece funcionar.
Incluso los siguientes casos especiales parecen ser difíciles: (1) cadenas en las que cada carácter aparece como máximo cuatro seis veces, y (2) cadenas con solo dos caracteres distintos. Como señala Per Austrin a continuación, el caso especial en el que cada personaje aparece como máximo cuatro veces se puede reducir a 2SAT.
Actualización: este problema tiene otra formulación que puede facilitar la prueba de dureza.
Considere una gráfica G cuyos vértices son los enteros 1 a n; identifique cada borde con el intervalo real entre sus puntos finales. Decimos que dos bordes de G están anidados si un intervalo contiene adecuadamente el otro. Por ejemplo, los bordes (1,5) y (2,3) están anidados, pero (1,3) y (5,6) no lo están, y (1,5) y (2,8) no lo están. Una coincidencia en G no está anidada si no hay ningún par de aristas anidado. ¿Existe un algoritmo rápido para determinar si G tiene una coincidencia perfecta no anidada, o ese problema es NP-difícil?
Desarmar una cadena es equivalente a encontrar una coincidencia perfecta no anidada en una unión disjunta de camarillas (con bordes entre caracteres iguales). En particular, deshacer una cadena binaria es equivalente a encontrar una coincidencia perfecta no anidada en una unión disjunta de dos camarillas. Pero ni siquiera sé si este problema es difícil para los gráficos generales, o fácil para cualquier clase interesante de gráficos.
Existe un algoritmo de tiempo polinómico fácil para encontrar coincidencias perfectas sin cruzamiento .
Actualización (24 de junio de 2013): ¡El problema está resuelto! Ahora hay dos pruebas independientes de que identificar cadenas cuadradas es NP-complete.
En noviembre de 2012, Sam Buss y Michael Soltys anunciaron una reducción de 3 particiones , lo que demuestra que el problema es difícil incluso para las cadenas sobre un alfabeto de 9 caracteres. Consulte "Desarmar un cuadrado es NP-Hard ", Journal of Computer System Sciences 2014.
En junio de 2013, Romeo Rizzi y Stéphane Vialette publicaron una reducción del problema de subsecuencia común más largo . Consulte " Acerca del reconocimiento de palabras que son cuadrados para el producto aleatorio ", Proc. 8º Simposio internacional de informática en Rusia , Springer LNCS 7913, pp. 235–245.
También hay una prueba más simple de que encontrar coincidencias perfectas no anidadas es NP-difícil, debido a Shuai Cheng Li y Ming Li en 2009. Ver " Sobre dos problemas abiertos de patrones de 2 intervalos ", Theoretical Computer Science 410 (24–25 ): 2410–2423, 2009.
fuente
Respuestas:
Michael Soltys y yo hemos logrado demostrar que el problema de determinar si una cadena se puede escribir como una combinación aleatoria es NP completo. Esto se aplica incluso sobre un alfabeto finito con solo símbolos distintos, aunque nuestra prueba está escrita para un alfabeto con símbolos. Esta pregunta aún está abierta para alfabetos más pequeños, digamos con solo símbolos. No hemos analizado el problema bajo la restricción de que cada símbolo aparece solo veces (o, más generalmente, un número constante de veces); entonces esa pregunta aún está abierta.9 2 67 9 2 6
La prueba utiliza una reducción de Partición. Es demasiado largo para publicar aquí, pero hay una preimpresión, "Desorganizar una cadena es -hard", está disponible en nuestras páginas web en:NP3 NP
http://www.math.ucsd.edu/~sbuss/ResearchWeb/Shuffle/
y
http://www.cas.mcmaster.ca/~soltys/#Papers .
El artículo ha sido publicado en el Journal of Computer System Sciences:
http://www.sciencedirect.com/science/article/pii/S002200001300189X
fuente
Para el caso especial que mencionas cuando cada personaje aparece como máximo cuatro veces, hay una reducción simple a 2-SAT (a menos que me falte algo ...), de la siguiente manera:
El punto crucial es que para cada personaje, hay (como máximo) dos formas válidas de hacer coincidir las apariciones del personaje (la tercera posibilidad será anidar). Use una variable booleana para representar cuál de las dos coincidencias se elige. Ahora, una asignación a estas variables proporciona una combinación aleatoria válida de la cadena iff para cada par de bordes anidados, no se eligieron ambos. Esta condición puede describirse con precisión mediante una disyunción de las variables (posiblemente negadas) correspondientes a los dos caracteres involucrados.
fuente
Aquí hay un algoritmo que puede tener alguna posibilidad de ser correcto, aunque parece difícil de probar y no apostaría la casa por eso ...
Después de la elección codiciosa, purgamos el gráfico nuevamente, y así sucesivamente, y el proceso termina cuando el gráfico es (con suerte) una coincidencia perfecta que no se anida.
Al principio pensé que esto sería más o menos como tener una pequeña mirada hacia adelante en el algoritmo codicioso y no funcionar realmente, pero me pareció sorprendentemente difícil encontrar un contraejemplo.
fuente
La solución que Sam Buss y yo propusimos en noviembre de 2012 (que muestra que quitar un cuadrado en NP-hard por una reducción de 3-Partition) ahora es un artículo publicado en el Journal of Computer System Sciences:
http://www.sciencedirect.com/science/article/pii/S002200001300189X
fuente
Romeo Rizzi y Stéphane Vialette demuestran que el reconocimiento de cadenas cuadradas es NP-complete en su artículo de 2013 " Sobre el reconocimiento de palabras que son cuadrados para el producto aleatorio ", por reducción del problema de subsecuencia binaria más largo. Afirman que la complejidad de mezclar cadenas binarias aún está abierta.
Shuai Cheng Li y Ming Li dan una prueba aún más simple de que encontrar una coincidencia perfecta no anidada es NP-complete en su artículo de 2009 " Sobre dos problemas abiertos de patrones de 2 intervalos ". Sin embargo, usan terminología heredada de bioinformática. En lugar de "coincidencia no anidada perfecta", lo llaman el "problema DIS-2-IP- ". Blin, Fertin y Vialette describen la equivalencia entre los dos problemas :{<,≬}
Actualización (25 de febrero de 2019): Bulteau y Vialette demostraron que el problema de decisión de desarmar una cadena binaria es NP completo en su trabajo, Reconocer los cuadrados aleatorios binarios es NP-duro .
fuente
¿Esto ayuda?
http://users.soe.ucsc.edu/~manfred/pubs/J1.pdf
fuente
NUNCA MENTE, ESTA RESPUESTA ES INCORRECTA. Falla en la entrada "AABAAB": hacer coincidir con avidez las dos primeras A entre sí hace que sea imposible hacer coincidir los símbolos restantes. Lo dejo en lugar de eliminarlo para ayudar a otros a evitar cometer el mismo error.
Me parece que siempre es seguro hacer coincidir con avidez cada personaje sucesivo del supuesto cuadrado con otro personaje igual que esté en la posición más temprana posible. Es decir, creo que el siguiente algoritmo de tiempo lineal debería funcionar:
Recorre cada posición i en la cadena de entrada, i = 0, 1, 2, ... n. Para cada posición i, verifique si esa posición ya se ha comparado con alguna posición anterior en la cadena. Si no, combínelo con un carácter igual que viene después de la última posición ya coincidente y, de lo contrario, es lo más temprano posible en la cadena. Si no se encuentra una coincidencia para algún carácter, declare que la entrada no es un cuadrado; de lo contrario, es el conjunto de caracteres en el primer par de cada partida.
Aquí está en Python:
Aquí i es la variable del bucle principal (la posición que estamos tratando de hacer coincidir), j es un puntero en la matriz de pares coincidentes que acelera la comprobación de si la posición i ya coincide, yk es un índice utilizado para buscar El personaje que coincide con el de la posición i. Es tiempo lineal porque i, j y k aumentan monotónicamente a través de la cadena y cada iteración del bucle interno aumenta uno de ellos.
fuente
Actualización: No tiene sentido hablar de la dificultad de encontrar perfecta coincidencia que no es de anidación y no cruce, cuando las etiquetas son de 1 a n, porque sólo hay uno de ellos. (Sí, me estoy pateando). Sin embargo, tendría sentido dado un rango más amplio en las etiquetas ... así que todavía veo algo de esperanza, pero después de todo podría ser bastante inútil. Sin duda tendría que seguir con esto un poco más.
No puedo pensar en por qué podría ser difícil encontrar un juego que no es de anidación y no cruce. Permítanme llamar a tal coincidencia una coincidencia disjunta . No estoy seguro de hasta qué punto esto ayuda, pero permítanme presentar el razonamiento de todos modos. (Debo señalar que mi argumento, tal como está aquí, no está completo, y el detalle que dejo de lado es posiblemente crucial. Sin embargo, imagino que podría ser algo así como un comienzo).
Comenzaré con un problema ligeramente diferente. Dado un gráfico cuyos bordes están coloreados con colores y los vértices están etiquetados de a , ¿hay una coincidencia disjunta que contenga exactamente un borde de cada color? Este problema parece ser NP-hard (el argumento para esto es completo y directo, a menos que me falte algo). La reducción arroja un gráfico que es una unión disjunta de camarillas.k 1 nG k 1 n
La reducción es de Factores Disjuntos , un problema NP-completo introducido en [1]. Una secuencia de factores disjuntos es dada por una cadena sobre un alfabeto de tamaño , y la pregunta es si hay factores disjuntos, donde un factor es una subcadena que comienza y termina con la misma letra; y dos factores son disjuntos si no se superponen en la cadena (tenga en cuenta que 'anidar', en particular, también está prohibido).kk k
Permítanme denotar por , los elementos del alfabeto de tamaño asociados con la instancia de Factores disjuntos. ka1,…,ak k
Dada una instancia de factores disjuntos, es decir, digamos una cadena de longitud , cree un gráfico que tenga vértices con etiquetas de vértice de a . Agregue un borde entre los vértices y si las posiciones correspondientes tienen la misma letra (digamos ), y también colorea el borde con el color .n 1 n un n 1 n u a i ( u , v ) iv ai (u,v) i
La prueba de la reducción se deriva esencialmente de las definiciones. Dados los factores disjuntos, claramente tenemos una coincidencia de colores disjuntos, simplemente escogemos los bordes según los factores disjuntos, y es fácil ver que la coincidencia resultante es colorida y disjunta. Por el contrario, si hay un colorido juego -disjoint, entonces tenemos k factores disjuntos, uno para cada letra, porque el juego es colorido (y por lo tanto recoge uno de los factores por letra), y es disjunta (por lo que los factores correspondientes no se superpondrán )k kk k k
Para deshacerse de los colores y hacer que la combinación sea perfecta, aunque en un rango posiblemente mayor , realice las siguientes modificaciones en el gráfico así creado:
Deje que denote el subconjunto de vértices que tienen etiquetas que son posiciones asociadas con la letra . Si tiene vértices , entonces agregue nuevos vértices e induzca un gráfico bipartito completo entre y los vértices recién agregados. Repita, por supuesto, para cada letra. a U a A ( A - 2 ) U aUa a Ua A (A−2) Ua
Hablando en términos generales, si el gráfico debe inducir una coincidencia perfecta, los vértices recién introducidos deben coincidir con los vértices de , y todos menos un par de vértices, y el borde entre los vértices restantes corresponderá al factor disjunto . No he resuelto los números que uno debe asociar con los vértices recién agregados ... tenga en cuenta que deben ser para que la coincidencia resultante sea disjunta. ¡Solo tengo la sensación (léase: esperanza) de que 'se puede hacer'!Ua
[1] Sobre problemas sin núcleos polinomiales , Hans L. Bodlaender, Rodney G. Downey, Michael R. Fellows y Danny Hermelin, J. Comput. Syst. Sci.
fuente
El enfoque no funciona: descomponer un cuadrado barajado sacando dos letras coincidentes no da como resultado cuadrados barajados ... Ver los comentarios de Radu a continuación.
Una propuesta de uso de la gama de concatenación Gramáticas (RCGS, ver http://hal.inria.fr/inria-00073347/en/ ): IΣ
'mestaba bajo la impresión de que el siguiente RCG sencilla reconoce su 'arrastrando los pies cuadrados' lenguaje durante un finita alfabeto , EDITADO después del primer comentario de Radu: donde rango sobre y denota el vacío cuerda.S ( X Y )La gramática verifica con el segundo predicado que coincide con una letra de la aparición de la primera palabra con la misma letra en la aparición de la segunda palabra. Luego adivina cómo hacer coincidir el resto de las letras de la primera palabra restante, es decir, con una subcadena del resto, es decir, . tanto, todo antes de pertenece a la primera instancia de palabra; Lo llamamos y suponemos que coincide con algún sufijo que comienza en . Tenga en cuenta que e pueden contener letras de ambas instancias de la palabra, pero y solo contienen letras de la primera instancia.X1 Y1 Y1 X2 Y2 Y1 Y2 X1 X2
Por ejemplo, aquí hay una posible derivación de su cadena :abcabdcd
Para ,0011
Ahora, Boullier muestra en el documento vinculado anteriormente que existe un algoritmo de tiempo polinómico de programación dinámica para RCG, que responde a su pregunta si la gramática anteriorX Y
escorrecta. La idea es que, aunque presenté las instancias de las variables , , etc. como cadenas, realmente son intervalos dentro de la cadena de entrada, que se pueden tabular correctamente.fuente
Actualización: Como Tsuyoshi Ito señala en los comentarios, este algoritmo tiene un tiempo de ejecución exponencial.
Publicación original:
Así es como programaría esto en el mundo real.
Se nos da una cadena S = (S [1], ..., S [n]). Para cada prefijo S_r = (S [1], ..., S [r]), hay un conjunto {(T_i, U_i)} de pares de cadenas, de modo que S_r es una combinación de (T_i, U_i), y T_i es un prefijo de U_i (es decir, U_i 'comienza con' T_i). S_r en sí es un cuadrado si y solo si este conjunto contiene un par (T_i, U_i) con T_i = U_i.
Ahora, no necesitamos generar todos estos pares; solo necesitamos generar el sufijo V_i de cada cadena U_i obtenida eliminando su copia de T_i. Esto eliminará un número (posiblemente exponencial) de duplicados irrelevantes. Ahora S_r es un cuadrado si y solo si este conjunto de sufijos contiene la cadena vacía. Entonces el algoritmo se convierte en:
Por ejemplo, si S es AABAAB:
Podemos descartar todos los sufijos que tengan más de la mitad del largo de la cadena de entrada, por lo que esto se simplifica a:
He programado esto en C ++, y funciona en todos los ejemplos dados aquí. Puedo publicar el código, si alguien está interesado. La pregunta es: ¿puede el tamaño de SuffixSet crecer más rápido que polinomialmente?
fuente
EDITAR: Esta es una respuesta incorrecta.
Sylvain sugirió un RCG que desafortunadamente no era apropiado para estos "cuadrados aleatorios". Sin embargo, creo que hay uno (EDITAR: ¡no un RCG, vea los comentarios de Kurt a continuación!) , Que se ve de la siguiente manera:
Explicación: recordar que tenemos para que coincida con los símbolos que pueden aparecer en cualquier parte de la cadena, pero una vez que hemos emparejado y'sólo podemos igualar y si implica ( que significa precedencia lineal). La idea es que separemos la cadena para comparar los prefijos de las mitades. Si los comienzos de dos subcadenas coinciden, podemos reducir el problema a las cadenas restantes . Si no, podemos transferir parte del lado derecho al lado izquierdoa a′ b b′ a≺b a′≺b′ ≺ (1,2) (3) (2) y ver si hay una coincidencia en una posición posterior. ¡Lo importante es que esto solo se permite en una dirección!
Aquí hay una derivación para (un contraejemplo al RCG de Sylvain):100110101010
No he elaborado una prueba formal de que esta gramática capte exactamente los "cuadrados aleatorios", pero no debería ser demasiado difícil. Sylvain ya mencionó que el problema de decisión para los RCG es polinomial.
fuente