Pregunta

Estoy buscando un algoritmo de alto rendimiento para verificar si puedo reconstruir una cadena dada con un conjunto dado de subcadenas. Más detalles:

Digamos que nuestras cadenas están sobre el alfabeto $ \ sigma $ .

entradas :

  • una cadena $ s \ in \ sigma ^ * $
  • un conjunto finito de cuerdas $ a={A_1, A_2, ..., A_N \} \ subsets \ Sigma ^ * $ .

salida :

  • Ya sea $ \ existe M: \ existe b_1, b_2, \ ldots, b_m \ en a: b_1 + b_2 + \ cdots + b_m= s $

donde $ + $ es una concatenación de cadena.

Por ejemplo, si $ s= {} $ " $ abcd $ " y $ A={$ " $ ab $ " $, $ < / span> " $ cd $ " $, $ " $ CA $ " $ \} $ , la respuesta es verdadera. A los efectos de esta pregunta, suponga que las cadenas en $ a $ se pueden reutilizar varias veces si es necesario.

¿Fue útil?

Solución

Si se reutiliza cadenas en $ a $ puede resolverlo con una programación dinámica: primero, almacenar cadenas en $ A $ en un árbol de prefijos (solo un árbol de sufijo invertido Link ), y Detriline recursivamente si $ s [i: final] $ se puede construir desde $ a $ : deja $ \ ell $ Be la longitud de la cadena, y Wlog asume $ s $ se adjunta por $ \ $$ y $ A \ Gets A \ Cup \ \ \ \ $ \ \ \ {/ span>. Morovere, deja $ m [i] \ in \ {0,1 \ \ {/ span> Indique si $ s [I: \ Ell] $ puede ser construido por elementos en $ a $ . Inicializar $ m [i] \ obtiene \ infty $ para $ i= 0, \ puntos, \ ell-1 $ < / span> y $ m [\ ell]= 1 $ (porque $ s [\ ell]=$$ < / span>). Ahora, supongamos que $ f (i) $ es la función que caliza recursivamente $ m [i] $ si Ya no se ha calculado. Cuando $ f (i) $ se llama, comience en la raíz del árbol del sufijo de $ a $ y Traverse $ s [i], s [i + 1], \ puntos $ en el árbol del sufijo hasta el índice $ J $ , de modo que el nodo correspondiente esté en $ a $ , y llame recursivamente $ f (j) $ . Si devuelve $ 1 $ , configure $ m [i]= 1 $ y devuelva $ 1 $ . De lo contrario, repita el proceso con el recorrido de $ s [j + 1], s [j + 2], \ puntos $ hasta otro miembro en $ a $ , o se alcanza una hoja. Si no hubo éxito, establecer $ m [I]= 0 $ y devolver $ 0 $ . Para decidir el problema, llame a $ f (1) $ . La peor complejidad de los casos es la complejidad es $ \ ell d $ , con $ d $ siendo la profundidad de la profundidad de la Árbol del sufijo (secuencia más larga en $ a $ ), más el costo de la construcción del árbol de prefijo.

Se evitará el peor de los casos en muchos casos porque la búsqueda de llamadas recursiva se detiene tan pronto como se encuentra una solución. Por lo tanto, en la práctica, el $ \ ell d $ parte podría ser mucho menos. La construcción del árbol del sufijo puede ser costoso dependiendo de $ a $ . Pero si $ A $ se usa para varias cadenas $ s $ , se amortiza el costo. Si $ a $ es realmente grande y $ s $ es corto, podría ser mejor ordenar los elementos. de $ a $ y hacer una búsqueda binaria en lugar de transversal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a cs.stackexchange
scroll top