我正在使用动态编程使用Levenshtein(编辑)距离做一些工作。我想我理解Wagner-Fischer算法可以有效地完成这项工作。但是,它看起来并不像算法是有建设性的。如果我计算两个字符串之间的编辑距离是例如10,那么我还想确定一个特定的10个编辑序列,它们将一个编辑到另一个。这可以有效地完成吗?如果是这样,怎么样?
答案 0 :(得分:1)
在尝试实现Ante算法时,我得到了完全错误的结果,但我怀疑这是错误的。
这是我实现它的方式,它工作正常:
(m, n)
开始(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)
的替代。将m
和n
减一。(m - 1, n - 1) == (m, n)
,则无操作。将m
和n
减一。如果任何单元格查找将导致负索引,则跳过它们。如果您到达单元格(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)
。
检查路径确定以相反顺序执行的编辑。