确定产生Levenshtein距离的编辑序列

时间:2014-08-10 19:12:58

标签: dynamic-programming levenshtein-distance edit-distance

我正在使用动态编程使用Levenshtein(编辑)距离做一些工作。我想我理解Wagner-Fischer算法可以有效地完成这项工作。但是,它看起来并不像算法是有建设性的。如果我计算两个字符串之间的编辑距离是例如10,那么我还想确定一个特定的10个编辑序列,它们将一个编辑到另一个。这可以有效地完成吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:1)

在尝试实现Ante算法时,我得到了完全错误的结果,但我怀疑这是错误的。

这是我实现它的方式,它工作正常:

  1. 从单元格(m, n)开始
  2. 检查单元格(m - 1, n - 1)(m - 1, n)(m, n - 1)并确定哪个单元格包含最小值。
    • 如果它是(m - 1, n),则您有一个删除项。将m减1。
    • 如果它是(m, n - 1),则您有一个插入。将n减1。
    • 如果它是(m - 1, n - 1),那么您要么
      • (m - 1, n - 1) < (m, n)的替代。将mn减一。
      • 如果(m - 1, n - 1) == (m, n),则无操作。将mn减一。

如果任何单元格查找将导致负索引,则跳过它们。如果您到达单元格(0, 0),那么您就完成了。您将以相反的顺序生成编辑列表。

答案 1 :(得分:0)

这是非常有建设性的。利用生成的矩阵,可以找到产生最小距离的所有不同编辑序列。

要查找修改,您必须在“向后”中传递结果矩阵。从结果单元格(m,n)开始。

  • 如果单元格(m-1, n-1)的值相同,则为这些字符 地方相同,不需要编辑。
  • 如果单元格(m-1, n-1)的值小于,则查找单元格的值 {(m-1, n-1), (m-1, n), (m, n-1)}具有最小值。最小的细胞的位置 value确定是否执行替换,删除或插入。如果有更多的细胞 最小值,比更多编辑序列可以产生最小距离。 如果您只需要一个序列而不是选择其中任何一个序列。

进行相同检查,直到路径到达单元格(0,0)

检查路径确定以相反顺序执行的编辑。