Levenshtein距离,分别跟踪插入/删除/替换

时间:2013-10-03 20:02:38

标签: algorithm levenshtein-distance

关于Levenshtein distance的维基百科文章在其possible modifications部分中说,“[可以分别存储插入,删除和替换的数量”。

这是怎么做到的?我创建了article中概述的基于矩阵的动态编程解决方案的实现,其中矩阵的每个单元格都有一个单独的删除/插入/替换值,但对于我的生活,我似乎无法找出逻辑。

直观地说,如果我发现需要在同一步骤中进行删除和插入,那么这些应该成为替代。

为了使我想要的东西完全清楚,这里是源字符串“mat”和目标字符串“catch”的示例矩阵。我希望这需要一次替换(即将“m”改为“c”)和两次插入(即附加“ch”)。每个细胞都是“缺失/插入/替换”。

           C     A     T     C     H
  +-----+-----+-----+-----+-----+-----+
  |D/I/S|0/1/0|0/2/0|0/3/0|0/4/0|0/5/0|
  +-----+-----+-----+-----+-----+-----+
M |1/0/0|0/0/1|0/1/1|0/2/1|0/3/1|0/4/1|
  +-----+-----+-----+-----+-----+-----+
A |2/0/0|1/0/1|0/0/1|0/1/1|0/2/1|0/3/1|
  +-----+-----+-----+-----+-----+-----+
T |3/0/0|2/0/1|1/0/1|0/0/1|0/1/1|0/2/1|
  +-----+-----+-----+-----+-----+-----+

有没有人制定出这个算法?

1 个答案:

答案 0 :(得分:4)

对于目标单元格x,我们需要找到最小值:

this + substitution | this + deletion
--------------------+----------------
this + insertion    |       x

从左上角开始,当我们尚未处理任何一个值时,我们必须同时处理这两个值,因此它是一个替代。

从左边开始我们还没有处理目标值,所以它就是插入。

从顶部开始我们尚未处理源值,因此它被删除。

要单独存储值,您需要一个3D数组:

array[targetSize+1][inputSize+1][3]

然后,对于前面3个单元格中的每一个,添加1个替换,删除或插入(如上所示),然后根据替换,删除和插入的数量计算总成本,并找到3的最小值成本。然后将给出最小值的单元格中的值复制到当前单元格(添加1个操作)。

所以,对于:

0/1/0|0/2/0
-----+-----
0/0/1|  x

我们假设每项操作的成本为1。

我们计算:
0/1/0 + 1替换= 0/1/1,费用= 2
0/0/1 + 1次插入= 0/1/1,费用= 2 0/2/0 + 1删除= 1/2/0,费用= 3

然后我们选择费用2中的任何一个并将0/1/1放入新单元格中。

我希望有所帮助。