空间复杂度以计算Levenshtein编辑距离的最佳字符串对齐方式


12

如果给定两个大小分别为n1字符串n2,则标准的Levenshtein编辑距离是通过具有时间复杂度O(n1n2)和空间复杂度的动态算法来计算的O(n1n2)。(可以根据编辑距离进行一些改进d,但我们不对d做任何假设dO(max(n1,n2))

但是,如果您想获得最佳编辑脚本的实际编辑,是否可能比内存使用情况做得更好,可能会花费运行时间?O(n1n2)

Answers:


15

尤瓦尔建议不要进行权衡。可以使用混合编程和Dan Hirschberg首先描述的分治法,在时间和空间中计算整个最佳编辑序列。(。用于计算最大公共子序列的线性空间算法。COMMUN ACM 18(6):341-343,1975年)O n + m O(nm)O(n+m)

直观上,Hirschberg的想法是在最佳编辑序列中途计算单个编辑操作,然后递归计算序列的两半。如果我们认为最佳编辑序列是从备注表的一个角到另一角的路径,则需要修改后的重复记录,以记录该路径与表的中间行的交叉点。一种有效的递归如下:

Half(i,j)={if i<m/2jif i=m/2Half(i1,j)if i>m/2 and Edit(i,j)=Edit(i1,j)+1Half(i,j1)if i>m/2 and Edit(i,j)=Edit(i,j1)+1Half(i1,j1)otherwise

可以使用时间与编辑距离表同时计算的值。由于备忘录表的每一行仅取决于其上方的行,因此计算和都只需要空间。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)if m1O(m)if n1O(mn)+maxh(T(m/2,h)+T(m/2,nh))otherwise
O m + n T(m,n)=O(mn)。类似地,由于我们一次只需要一个动态编程通道的空间,因此总的空间边界仍然是。(递归堆栈的空间可以忽略不计。)O(m+n)

5
因为当Dan在我的资格考试中问我时我错过了这一点,这就是原因。
杰夫·ε12年

我记得曾将此作为一项(指导性)锻炼,并认为它非常酷
Sasho Nikolov 2012年

3

您描述的在空间中运行的算法实际上恢复了最终编辑,并恢复了最终编辑之前的状态。因此,如果将此算法运行次,则可以恢复整个编辑序列,但要增加运行时间。通常,存在时空折衷,该折衷由您当时保留的行数控制。这种折衷的两个极端是空间和空间,在这两个极端之间,时间和空间的乘积是恒定的(最大为O)。O n 1 + n 2O n 1 n 2O n 1 + n 2O(n1+n2)O(n1+n2)O(n1n2)O(n1+n2)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.