编辑距离及其回溯路径
2015-08-30 11:26
2216 查看
编辑距离(Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许对字符串中的字符进行的的操作只有替换、插入、删除三种操作。 编辑距离的计算方法和原理网上都有很多介绍,不再赘述。
假设计算
str1=bcdabcdef
str2=abcdefbcd
的编辑距离,先要构建如下图的矩阵
把str2变为str1,将str2写在横行,str1写在竖列
之后每个元素的值按照下式计算
如果最上方的字符等于最左方的字符,则为左上方的数字。否则为左上方的数字+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
4000
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
的编辑距离,先要构建如下图的矩阵
把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
4000
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步操作。
相关文章推荐
- 文本相似度计算之--- 编辑距离 && 最长公共子串
- 字符串编辑距离的计算方法
- 动态规划之最长公共子序列和编辑距离
- 编辑距离 python
- Levenshtein算法
- 字符串编辑距离
- POJ 3356(编辑距离)
- HDU4323-2012多校三-编辑距离
- python-Levenshtein几个计算字串相似度的函数解析
- 编辑距离、拼写检查与度量空间:一个有趣的数据结构
- 编辑距离算法
- DP_编辑距离问题
- 编辑距离(Edit Distance | Levenshtein距离)
- Levenshtein Distance算法实现简单文本相似度分析
- 实用算法索引
- 基于lucene-ngram的拼写纠错功能
- Leet Code 72 Edit Distance - 编辑距离 - Java
- 相近字符串的匹配--编辑距离问题
- Hust oj 1284 编辑距离(DP)
- hdu 4323 编辑距离