Yuval nie ma potrzeby kompromisu. Całą optymalną sekwencję edycji można obliczyć w czasie i przestrzeni , używając mieszanki programowania dynamicznego oraz funkcji dziel i zwyciężaj, opisanej po raz pierwszy przez Dana Hirschberga. ( Algorytm przestrzeni liniowej do obliczania maksymalnych wspólnych podsekwencji. Commun. ACM 18 (6): 341–343, 1975.)O ( n + m )O ( n m )O ( n + m )
Intuicyjnie pomysł Hirschberga polega na obliczeniu pojedynczej operacji edycji w połowie optymalnej sekwencji edycji, a następnie rekurencyjnym obliczeniu dwóch połówek sekwencji. Jeśli myślimy o optymalnej sekwencji edycji jako ścieżce od jednego rogu tabeli do zapamiętywania do drugiego, potrzebujemy zmodyfikowanego cyklu, aby zapisać, gdzie ta ścieżka przecina środkowy rząd tabeli. Jednym z powtarzających się działań jest:
H.a l f( i , j ) = ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪∞jotH.a l f( i - 1 , j )H.a l f(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
Wartości można obliczyć w tym samym czasie, co edytowanie tabeli odległości , stosując czas . Ponieważ każdy wiersz tabeli zapamiętywania zależy tylko od wiersza nad nim, obliczenie zarówno i wymaga tylko miejsca .E d i t ( i , j ) O ( m n ) E d i t ( m , n ) H a l f ( m , n ) O ( m + n )H.a l f( i , j )mirei t ( i , j )O ( m n )mirei t ( m , n )H.a l f( m , n )O ( m + n )
Wreszcie optymalna sekwencja edycji przekształcająca ciągi wejściowe na składa się z optymalnych sekwencji przekształcających na a następnie optymalna sekwencja transformująca w . Jeśli rekurencyjnie obliczymy te dwa podsekwencje, całkowity czas działania będzie zgodny z następującą powtarzalnością:
Nietrudno udowodnić, żeB [ 1 .. n ] A [ 1 . . m / 2 ] B [ 1 . . H a l f ( m , n ) ] A [ m / 2 + 1 . . m ] B [ H a l f ( m , n ) + 1 . . nA [ 1 .. m ]B [ 1 .. n ]A [ 1 . . m / 2 ]B [ 1 . . H.a l f( m , n ) ]A [ m / 2 + 1 . . m ]T ( m , n ) = { O ( n ) jeśli m ≤ 1 O ( m ) jeśli n ≤ 1 O ( m n ) + max h ( T ( m / 2 , h ) + T ( m / 2 , n - h ) ) w innym przypadku T ( m , nB [ Ha l f( m , n ) + 1 . . n ]
T.( m , n ) = ⎧⎩⎨O ( n )O ( m )O ( m n ) + maksh( T( m / 2 , h ) + T.( m / 2 , n - h ) )jeśli m ≤ 1jeśli n ≤ 1Inaczej
T.( m , n ) = O ( m n ). Podobnie, ponieważ potrzebujemy miejsca tylko na jedno przejście programowania dynamicznego naraz, łączna przestrzeń ograniczona jest nadal . (Miejsce na stos rekurencyjny jest znikome.)
O ( m + n )
Opisany algorytm działający w przestrzeni faktycznie przywraca ostateczną edycję i stan tuż przed ostateczną edycją. Jeśli więc uruchomisz ten algorytm razy, możesz odzyskać całą sekwencję edycji kosztem zwiększenia czasu działania. Ogólnie rzecz biorąc, istnieje kompromis czasoprzestrzenny, który jest kontrolowany przez liczbę wierszy, które zachowałeś w tym czasie. Dwa skrajne punkty tego kompromisu to przestrzeń i przestrzeń , a między nimi iloczyn czasu i przestrzeni jest stały (do dużego O).O ( n1+ n2)) O ( n1+ n2)) O ( n1n2)) O ( n1+ n2))
źródło