编辑距离及编辑距离算法

来源:互联网 发布:长寿行知计算机老师 编辑:程序博客网 时间:2024/05/16 01:21

编辑距离概念描述:

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

  1. sitten (k→s)
  2. sittin (e→i)
  3. sitting (→g)

俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。

 

问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符

 

解析:

首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。

显然可以有如下动态规划公式:

  • if i == 0 且 j == 0,edit(i, j) = 0
  • if i == 0 且 j > 0,edit(i, j) = j
  • if i > 0 且j == 0,edit(i, j) = i
  • if i ≥ 1  且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

 

 

 0failing0        s        a        i        l        n        

 

 

 0failing001234567s1       a2       i3       l4       n5       

 计算edit(1, 1),edit(0, 1) + 1 == 2,edit(1, 0) + 1 == 2,edit(0, 0) + f(1, 1) == 0 + 1 == 1,min(edit(0, 1),edit(1, 0),edit(0, 0) + f(1, 1))==1,因此edit(1, 1) == 1。 依次类推:

 0failing001234567s11234567a22      i3       l4       n5       

edit(2, 1) + 1 == 3,edit(1, 2) + 1 == 3,edit(1, 1) + f(2, 2) == 1 + 0 == 1,其中s1[2] == 'a' 而 s2[1] == 'f'‘,两者不相同,所以交换相邻字符的操作不计入比较最小数中计算。以此计算,得出最后矩阵为:

 0failing001234567s11234567a22123456i33212345l44321234n55432223

 java代码

public class 编辑距离 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubString str1="sailn";String str2="failing";int r = edit(str1, str2);System.out.println(r);}private static int edit(String str1, String str2) {// TODO Auto-generated method stubint max1 = str1.length();    int max2 = str2.length();    char a[]=str1.toCharArray();    char b[]=str2.toCharArray();    int ptr[][]=new int[max1+1][max2+1];    for(int i = 0 ;i < max1 + 1 ;i++)    {        ptr[i][0] = i;    }    for(int i = 0 ;i < max2 + 1;i++)    {        ptr[0][i] = i;    }    for(int i=1;i<max1+1;i++){    for(int j=1;j<max2+1;j++){    int d;    int temp = min(ptr[i-1][j] + 1, ptr[i][j-1] + 1);    if(a[i-1] == b[j-1])            {                d = 0 ;            }else{            d=1;            }    ptr[i][j] = min(temp, ptr[i-1][j-1] + d);    }    }    for(int i = 0 ;i < max1 + 1 ;i++)    {        for(int j = 0; j< max2 + 1; j++)        {            System.out.print(ptr[i][j]+" ");        }        System.out.println();    }    int dis = ptr[max1][max2];return dis;}private static int min(int i, int j) {// TODO Auto-generated method stubreturn i<j?i:j;}}


0 0
原创粉丝点击