1)为什么我们在这些行上加1?
d[i-1, j] + 1, // deletion
d[i, j-1] + 1, // insertion
该行
if s[i] = t[j] then cost := 0
else cost := 1
应该考虑删除/缩短字长,还是我遗漏了什么?
2)此外,评论状态删除和插入。我是否认为它正在检查两个单词中的已删除字符(整数j / i表示单词的长度),因为较低的值将表示已删除的字符。
使用的代码在这里(因为它是伪代码,我没有语言特定的问题,这个帖子不属于任何语言类别):
http://www.iterasi.net/openviewer.aspx?sqrlitid=z0cloj7xhk-ce0f72v4cjq
答案 0 :(得分:2)
您是否阅读过http://www.merriampark.com/ld.htm?
您正在计算将一个字符串转换为另一个字符串所需的转换成本 - 插入和删除的数量。
变换的“成本”表示两个字符串之间的距离。
交流怎么样?这是Damerau–Levenshtein算法,这是不同的。包括交流在内并没有太大改善。
本质上是在两个单词之间创建一个矩阵并逐列计算 - 从每个单词的每个字母到另一个单词的每个字母的“距离”。该矩阵的右下角是总距离,考虑了所有字母。
问题1)
“上方”单元格反映了更改的历史记录,该行的字符(通常)与此不同,因此该单元格是相对于它的删除。
单元格“left”反映了更改的历史记录,该列的字符(通常)与此不同,因此该单元格是相对于它的插入。
这通常会出错的唯一时间是带有三字母序列的单词。罕见的英文。
行列比较的成本为0或1.
“历史加一次更改”的最低值和更改的实际费用是适用的费用。
问题2)
变量i
和j
不是任何长度。它们是比较矩阵中的位置。 “插入”和“删除”是将一个单词转换为另一个单词所需的动作。插入/删除操作的计数是单词之间的距离。
答案 1 :(得分:1)
1)这些行在插入的情况下计算删除时的距离,在替换的情况下计算使用“成本”的距离......
删除和插入在距离计算中有效地计为“1”,因此+1。
我们可以相信只有字符不同才有替换,因此如果两个字符相等,则“cost = 0”...
新距离就是这三个假设之间的最小距离所以你不总是加1 ......
2)如果我计算“FooBar”和“FoBaWhatever”之间的距离,即使第二个字符串长于第一个字符串,我也会有一些字符删除...
当然如果第二个字符串比第二个字符串短(FooBar - > FoBa),我会发现一些删除但不能提前知道它们在哪里...