尤瓦尔建议不要进行权衡。可以使用混合编程和Dan Hirschberg首先描述的分治法,在时间和空间中计算整个最佳编辑序列。(。用于计算最大公共子序列的线性空间算法。COMMUN ACM 18(6):341-343,1975年)O (n + m )O(nm)O(n+m)
直观上,Hirschberg的想法是在最佳编辑序列中途计算单个编辑操作,然后递归计算序列的两半。如果我们认为最佳编辑序列是从备注表的一个角到另一角的路径,则需要修改后的重复记录,以记录该路径与表的中间行的交叉点。一种有效的递归如下:
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
可以使用时间与编辑距离表同时计算的值。由于备忘录表的每一行仅取决于其上方的行,因此计算和都只需要空间。Half(i,j)Edit(i,j)O(mn)Edit(m,n)Half(m,n)O(m+n)
最后,将输入字符串转换为的最佳编辑序列由将转换为然后是将转换为的最佳序列。如果我们递归计算这两个子序列,则总运行时间遵循以下递归:
不难证明A[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)。类似地,由于我们一次只需要一个动态编程通道的空间,因此总的空间边界仍然是。(递归堆栈的空间可以忽略不计。)
O(m+n)