编辑距离(Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许对字符串中的字符进行的的操作只有替换、插入、删除三种操作。 编辑距离的计算方法和原理网上都有很多介绍,不再赘述。
假设计算
str1=bcdabcdef
str2=abcdefbcd
的编辑距离,先要构建如下图的矩阵
把str2变为str1,将str2写在横行,str1写在竖列
之后每个元素的值按照下式计算
<span style="font-size:18px;"> //计算替换操作的代价,如果两个字符相同,则替换操作代价为0,否则为1
if str1[i]== str2[j] then cost := 0
else cost := 1
//d[i,j]的Levenshtein距离,可以有
d[i, j] := minimum(
d[i-1, j] + 1, //在str2上j位置删除字符(或者在str1上i-1位置插入字符)
d[i, j-1] + 1, //在str2上j-1位置插入字符(或者在str1上i位置删除字符)
d[i-1, j-1] + cost // 替换操作</span>即每一位的值由其左侧、上侧和左上角的数值决定,取以下三个值的最小值:
-
如果最上方的字符等于最左方的字符,则为左上方的数字。否则为左上方的数字+1。(对于3,3来说为0)
-
左方数字+1(对于3,3格来说为2)
-
上方数字+1(对于3,3格来说为2)
之后会得到完整的距离矩阵,最右下角的值即为编辑距离。如下图,str1和str2的编辑距离即为5。
找到编辑距离后要想明白实际是怎样操作的,就需要找到回溯路径。寻找回溯路径时要从右下角的元素开始,依次看当前元素是如何得到的,有时一个元素可能有多种得到的方式,即表明可以有多种操作可以得到相同的结果。上图的红色箭头即为回溯路径。将回溯路径再反过来就可得到实际编辑操作的路径。
编辑过程:
str2=a b c
d e f b c d
str1=b c d
a b c d e f
1、向左走,即 d[ 1,1] = d[ 1-1,1 ]+1 , str2 要删除第一个字符,变为 bcdefbcd
2、斜向下,且值未变,说明相同,不用操作
str2 =b c d
e f b c f
str1 =b c d
a b c d e f
3、 d 之后向左,即删除 e
4、斜向下,且值加1,表示替换,将f换为a
str2 =b c d
a b c f
str1 =b c d
a b c d e
f
5、最后两步向下,表示添加,此处添加 e, f
str2 =
b c d a b c f e f
str1 =
b c d a b c d e f
共5步操作。
编辑距离算法与回溯路径解析
本文探讨了编辑距离的概念,即通过替换、插入、删除操作将一个字符串转换为另一个字符串所需的最少次数。以str1=bcdabcdef和str2=abcdefbcd为例,展示了构建编辑距离矩阵的过程,并解释了计算每个矩阵元素值的方法。通过比较上方和左方字符及数值,确定当前格子的值。
15

被折叠的 条评论
为什么被折叠?



