编辑距离及其回溯路径

来源:互联网 发布:数据库表重命名as语句 编辑:程序博客网 时间:2024/06/18 10:21

编辑距离(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步操作。






0 0
原创粉丝点击