关于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| +-----+-----+-----+-----+-----+-----+
有没有人制定出这个算法?
答案 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
放入新单元格中。
我希望有所帮助。