# Problema de la subsecuencia más larga

En Ciencias de la Computación, el problema de la subsecuencia creciente máxima consiste en encontrar una subsecuencia de una secuencia dada donde los elementos de la subsecuencia están ordenados, de menor a mayor, y la subsecuencia sea tan larga como sea posible. Esta subsecuencia no es necesariamente continua, o única. La subsecuencias crecientes máximas son estudiadas por varias disciplinas relacionadas con las matemáticas, incluyendo algoritmos, física y teorías de matriz aleatoria. El problema de la subsecuencia creciente máxima es soluble en O(n log n), donde n denota el tamaño de la secuencia de entrada.

## Ejemplo

En los primeros 16 términos de la secuencia de Van der Corput binaria
    0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15
una subsecuencia creciente máxima es
    0, 2, 6, 9, 11, 15.
Esta subsecuencia tiene longitud seis; la subsecuencia de entrada no tiene subsecuencias crecientes de tamaño siete. La subsecuencia creciente máxima en este ejemplo no es única: por ejemplo,
    0, 4, 6, 9, 11, 15 o 0, 4, 6, 9, 13, 15
son otras subsecuencias creciente de igual longitud para la misma subsecuencia de entrada.

## Relación con otros problemas algorítmicos

El problema de la subsecuencia creciente máxima está estrechamente relacionado con el problema de subsecuencia común más larga, que tiene una solución de programación dinámica en tiempo cuadrático: la subsecuencia creciente máxima de una secuencia S es la subsecuencia común máxima de S y T, donde T es el resultado de ordenar S. Sin embargo, para el caso especial en que la entrada es una permutaciòn de enteros 1, 2, ..., n, esta propuesta puede ser ejecutada mucho más eficientemente , llegando a un tiempo de la forma O(n log log n).
El clique mayor en un grafo de permutación está definido por la subsecuencia decreciente máxima de la permutación que define al grafo; la subsecuencia decreciente máxima es equivalente en complejidad computacional, utilizado el opuesto de los números de entrada, a la subsecuencia creciente máxima. Así, los algoritmos de la subsecuencia creciente máxima pueden ser usados para resolver el problema del clique eficientemente en permutation graphs.
En la correspondencia Robinson–Schensted entre permutaciones y la tabla de Young, la longitud de la primera fila de la tabla correspondiente a la permutaciónes igual a la longitud de la subsecuencia creciente más larga de la permutación, y la longitud de la primera columna es igual a la longitud de la subsecuencia decreciente más larga.

## Algoritmos eficientes

El algoritmo descrito abajo resuelve el problema de la subsecuencia creciente más larga eficientemente con arreglos y búsqueda binaria. Se procesa la secuencia de elementos en orden, manteniendo la subsecuencia creciente máxima encontrada hasta el punto actual. Denotando los valores de la secuencia como X[0], X[1], etc. Entonces, luego de procesar X[i], el algoritmo tendrá almacenado valores en dos arreglos:
    M[j] — almacena el índice k del menor valor X[k] tal que existe una
subsecuencia creciente de longitud j que termina en X[k] en el rango k ≤ i. Note que j ≤ k ≤ i, pues j representa la longitud de la subsecuencia creciente, y k representa el índice de su terminación. No puede haber una subsecuencia creciente de longitud 13 terminando en el índice 11. k ≤ i por definición.
    P[k] — almacena el índice del predecesor de X[k] en la subsecuencia creciente
máxima que termina en X[k]. Además, el algoritmo cuenta con una variable L representando la longitud de la subsecuencia creciente máxima que se va calculando. Dado que el algoritmo usa numeración con base cero, para mayor claridad M es iniciada con M[0], que será aprovechado de tal forma que M[j] corresponde a la subsecuencia de longitud j. Una implementación real puede saltarse M[0] y ajustar los índices.
Note que, en cualquier punto del algoritmo, la secuencia
    X[M[1]], X[M[2]], ..., X[M[L]]
es nodecreciente. Para, si existe una subsecuencia creciente de longitud i terminando en X[M[i]], entonces existe también una subsecuencia de longitud i-1 terminando en un valor más pequeño: concretamente el que termina en X[P[M [i]]]. Así, es posible una búsqueda binaria en esta secuencia en tiempo logarítmico.
El algoritmo, entonces, procede de la siguiente forma:
Dado que el algoritmo realiza solo una búsqueda binaria por elemento de la secuencia, su tiempo total puede ser expresado usando notación O grande como O(n log n).Fredman (1975) analizó una variante para este algoritmo, que se la acredita a Donald Knuth; en la variante estudiada por él, el algoritmo examina cuando cada valor X[i]puede ser usado para extender la subsecuencia creciente máxima actual, en tiempo constante, previo a la búsqueda binaria. Con esta modificación, el algoritmo usa a lo sumo n log$_2$ n - n log$_2$log$_2$ n + O(n) comparaciones en el peor caso, que es óptimo para un algoritmo basado en comparaciones para el factor constante en el término O(n).

## Límites de tamaño

De acuerdo con el Teorema de Erdős–Szekeres, cualquier secuencia de n$^2$+1 enteros diferentes tiene una subsecuencia creciente o decreciente de longitud n + 1. Para entradas donde cada permutación de la entrada es igualmente probable, la longitud esperada de la subsecuencia creciente máxima es aproximadamente 2√n. En el límite como n tiende al infinito, la longitud de la subsecuencia creciente más larga de una secuencia permutada de forma aleatoria de n elementos tiene una distribución aproximada a la distribución Tracy–Widom.