No hay necesidad de la compensación que sugiere Yuval. La secuencia de edición óptima completa se puede calcular en tiempo y espacio , utilizando una mezcla de programación dinámica y divide y vencerás descrita por primera vez por Dan Hirschberg. ( Un algoritmo de espacio lineal para calcular subsecuencias comunes máximas. Commun. ACM 18 (6): 341–343, 1975.)O ( n + m )O(nm)O(n+m)
Intuitivamente, la idea de Hirschberg es calcular una sola operación de edición a la mitad de la secuencia de edición óptima, y luego calcular recursivamente las dos mitades de la secuencia. Si pensamos en la secuencia de edición óptima como una ruta desde una esquina de la tabla de memorización a la otra, necesitamos una recurrencia modificada para registrar dónde esta ruta cruza la fila central de la tabla. Una recurrencia que funciona es la siguiente:
Half(i,j)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪∞jHalf(i−1,j)Half(i,j−1)Half(i−1,j−1)if i<m/2if i=m/2if i>m/2 and Edit(i,j)=Edit(i−1,j)+1if i>m/2 and Edit(i,j)=Edit(i,j−1)+1otherwise
Los valores de pueden calcularse al mismo tiempo que la tabla de distancia de edición , utilizando el tiempo . Como cada fila de la tabla de memorización depende solo de la fila que se encuentra sobre ella, calcular tanto la como la requiere solo espacio .Half(i,j)Edit(i,j)O(mn)Edit(m,n)Half(m,n)O(m+n)
Finalmente, la secuencia de edición óptima que transforma las cadenas de entrada en consiste en las secuencias óptimas que transforman en seguido de la secuencia óptima que transforma en . Si calculamos esas dos subsecuencias de forma recursiva, el tiempo de ejecución general obedece a la siguiente recurrencia:
No es difícil demostrar queA[1..m]B[1..n]A[1..m/2]B[1..Half(m,n)]A[m/2+1..m]B[Half(m,n)+1..n]
T(m,n)=⎧⎩⎨O(n)O(m)O(mn)+maxh(T(m/2,h)+T(m/2,n−h))if m≤1if n≤1otherwise
O ( m + n )T(m,n)=O(mn). Del mismo modo, dado que solo necesitamos espacio para un pase de programación dinámica a la vez, el espacio total limitado sigue siendo . (El espacio para la pila de recursión es insignificante).
O(m+n)