zoukankan      html  css  js  c++  java
  • 编辑距离及编辑距离算法

    快看小说网编辑距离概念描述:

    编辑距离,又称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。

     

     

      0 f a i l i n g
    0                
    s                
    a                
    i                
    l                
    n                

     

     

      0 f a i l i n g
    0 0 1 2 3 4 5 6 7
    s 1              
    a 2              
    i 3              
    l 4              
    n 5              

     计算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。 依次类推:

      0 f a i l i n g
    0 0 1 2 3 4 5 6 7
    s 1 1 2 3 4 5 6 7
    a 2 2            
    i 3              
    l 4              
    n 5              

    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'‘,狂兵归来林烨两者不相同,所以交换相邻字符的操作不计入比较最小数中计算。以此计算,得出最后矩阵为:

      0 f a i l i n g
    0 0 1 2 3 4 5 6 7
    s 1 1 2 3 4 5 6 7
    a 2 2 1 2 3 4 5 6
    i 3 3 2 1 2 3 4 5
    l 4 4 3 2 1 2 3 4
    n 5 5 4 3 2 2 2 3

     java代码

     

    public class 编辑距离 {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String 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 stub
    		int 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 stub
    		return i<j?i:j;
    	}
    
    }
    

     刷题刷累了就来看书吧。推荐给大家一个不错的看书网站快看小说网

     

     

     

  • 相关阅读:
    asp.net 2.0 国际化 动态切换语言
    SKU、UPC、EAN和ISBN
    NCalc:处理数学运算的好帮手
    yaf 论坛安装
    Afterlogic xmail 邮局软件不能收email 设置
    要围着中心来做事
    保证Winform程序只有一个实例在运行
    可视热敏读写卡开发
    jQuery CSS 效果
    代碼小片斷
  • 原文地址:https://www.cnblogs.com/Katerina/p/11355153.html
Copyright © 2011-2022 走看看