La tarea de encontrar la subsecuencia común más larga ( eng. subsecuencia común más larga , LCS) es la tarea de encontrar una secuencia que es una subsecuencia de varias secuencias (generalmente dos). A menudo, el problema se define como encontrar todas las subsecuencias más grandes. Este es un problema clásico de informática , que tiene aplicaciones, en particular, en el problema de comparación de archivos de texto (la utilidad diff ), así como en bioinformática .
Se puede obtener una subsecuencia de alguna secuencia finita si se elimina algún conjunto de sus elementos (posiblemente vacío) de esta última. Por ejemplo, BCDB es una subsecuencia de la secuencia ABCDBAB. Decimos que una secuencia Z es una subsecuencia común de las secuencias X e Y si Z es una subsecuencia tanto de X como de Y. Se requiere que dos secuencias X e Y encuentren una subsecuencia común de la mayor longitud. Tenga en cuenta que puede haber varios NOP.
¡Nota! Una subsecuencia es diferente de una subcadena . Por ejemplo, si hay una secuencia fuente "ABCDEF", entonces "ACE" será una subsecuencia pero no una subcadena, y "ABC" será tanto una subsecuencia como una subcadena.
Comparemos dos métodos de solución: búsqueda de fuerza bruta y programación dinámica .
Existen diferentes enfoques para resolver este problema con una enumeración completa: puede ordenar las opciones de subsecuencia, las opciones de eliminación de estas secuencias, etc. Sin embargo, en cualquier caso, el tiempo de ejecución del programa será un polinomio en la longitud de las cadenas.
A | B | C | D | ||
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | |
D | 0 | ← 0 | ← 0 | ← 0 | ↖ 1 |
C | 0 | ← 0 | ← 0 | ↖ 1 | ← 1 |
D | 0 | ← 0 | ← 0 | ↑ 1 | ↖ 2 |
A | 0 | ↖ 1 | ← 1 | ← 1 | ↑ 2 |
Primero, encuentre la longitud de la subsecuencia más grande. Supongamos que estamos buscando una solución para el caso (n 1 , n 2 ), donde n 1 , n 2 son las longitudes de la primera y segunda cadena. Deje que ya existan soluciones para todos los subproblemas (m 1 , m 2 ) más pequeños que el dado. Luego, la tarea (n 1 , n 2 ) se reduce a subtareas más pequeñas de la siguiente manera:
Ahora volvamos al problema de construir una subsecuencia. Para ello, añadimos al algoritmo existente una memoria para cada tarea de la subtarea a través de la cual se resuelve. La siguiente acción, partiendo del último elemento, subimos al principio siguiendo las direcciones dadas por el primer algoritmo, y escribimos los caracteres en cada posición. Esta será la respuesta para este problema.
El tiempo de ejecución del algoritmo será .
Instrumentos de cuerda | |
---|---|
Medidas de similitud de cadenas | |
Búsqueda de subcadena | |
palíndromos | |
Alineación de secuencia | |
Estructuras de sufijos | |
Otro |