用于编辑距离计算的微优化:有效吗?


10

Wikipedia上,给出了自下而上的用于编辑距离的动态编程方案的实现。它没有完全遵循定义。内部单元的计算如下:

if s[i] = t[j] then  
  d[i, j] := d[i-1, j-1]       // no operation required
else
  d[i, j] := minimum
             (
               d[i-1, j] + 1,  // a deletion
               d[i, j-1] + 1,  // an insertion
               d[i-1, j-1] + 1 // a substitution
             )
}

如您所见,如果存在匹配项,该算法始终从左上角的邻居中选择值,从而节省了一些内存访问,ALU操作和比较。

但是,删除(或插入)可能会导致较小的值,因此该算法在局部上是不正确的,即,它违反了最佳标准。但是也许错误不会改变最终结果-可能会消除它。

这种微优化有效吗?为什么不呢?

Answers:


6

我不认为该算法有缺陷。如果两个字符串匹配,我们首先比较其最后两个字符(然后递归)。如果它们相同,我们可以匹配它们以获得最佳对齐方式。例如,考虑字符串testtestat。如果您不匹配最后两个ts,则其中一个ts将保持不匹配状态,因为否则您的匹配将如下所示:

在此处输入图片说明

这是不可能的,因为不允许箭头“交叉”。匹配项t诱导了几个插入物(图中的绿色框),如左图所示:

在此处输入图片说明

但是您可以简单地找到一个正确的对齐方式,如右图所示。在这两种情况下,您都匹配一个t并且您有两个插入物。

替换最后一个ts的参数是相同的。因此,如果替换最后一个ts,则可以匹配最后两个t,以获得更好的对齐方式(请参见图片)。

在此处输入图片说明


啊,自下而上的问题的自上而下的论点。真好!
拉斐尔
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.