动态规划之最小编辑距离问题

       先说点题外话,早上同学给我了一套卷子,让我做,他对象的机试题,第一题是求点队中的最小距离点对,没说数据量,那肯定直接暴力就行了(有给分点,正确输入给5分,什么什么给五分),或者分治算法(编程之美里的);第二题是替换字符串;第三题是求给出的四边形的面积,逼着认为这个不能用海伦公式,因为可能是凹四边形,需要向量公式。题目如此简单,这就是北邮,这种题目能考察出来水平么,哎,或许真是考研的学生水平都不高,只是会看书会考试而已。

       昨天上午去市区,媳妇给我买了一个摇头草种子,今天泡上了,希望它快快长大。

                    

       昨晚吃饭,本科的张同学惊讶于我说的体重,找了个诊所,直接进去测,发现真的是70kg,本科时候我从来不到60kg。

一、问题来源

       看云计算的书,提到微博去重,因为数据量巨大,需要先Hash再MapReduce,那么如何Hash把相似的微博尽可能放到同一个桶里呢?用哪个Hash呢,作者提出了局部敏感Hash算法,中间的距离度量函数可以使用编辑距离(Edit Distance),但是编辑距离右脚Levenshtein莱温斯坦距离,即LD,写到这,笔者突然想到,ED距离是不是就是编辑距离,原来我认为是欧几里得距离。哈哈,这真是“文章本天成,妙手偶得之”。

       我查了资料发现编辑距离在NLP(神经语言程序学)中应用广泛。

二、问题分析

       下面资料,来自北大,这真是人才的摇篮,我不知道我咋找到这个资料的,记得以前这类资料也都是pdf链接,现在依旧。而且笔者发现,他们的资料更加细致,可能出现的问题都做了标注,这些问题包括读者能想到的和不能想到的,很有启发性和警醒作用,为何说警醒,因为你突然发现自己的误解,那么就不会那么自满了;北大和我校的区别,就像高中老师和大学老师的区别。此偶之愚见也。

       1.引入

       源文:She is a star with the theatre company.

       机器译文:她 是 与 剧院 公司 的 一 颗 星。

       参考译文:她 是 剧团 的 明星。
           

 

       2.算法分析

            

       看完接下来的资料,我发现,Dijkstra算法从后往前推结果,编程却是从前往后,但是不理解,现在想来,这是必然的。因为d[i][j]=min{d[i-1][j-1]……},结果是d[m][n]不算出前面的怎么计算出d[m][n],从前往后是递推,从后往前类似递归,哈哈。

       参考资料:http://ccl.pku.edu.cn/doubtfire/Course/Computational%20Linguistics/contents/Minimum%20Edit%20Distance.pdf

三、算法实现

       1.Java版本

        上面算法的变形实现,或者直接写个min(a,b,c)函数就是上面的算法实现了。

public class MinimumEditDistance { 

    public static int minEditDistance(String dest, String src) {
        int[][] f = new int[dest.length()+1][src.length() + 1];
        f[0][0] = 0;
        for (int i = 1; i < dest.length() + 1; i  ) {
            f[i][0] = i;
        }
        for (int i = 1; i < src.length() + 1; i  ) {
            f[0][i] = i;
        }
        for (int i = 1; i < dest.length() + 1; i  ) {
            for (int j = 1; j < src.length() + 1; j  ) {
                // 替换的开销
                int cost = 0;
                if (dest.charAt(i - 1) != src.charAt(j - 1)) {
                    cost = 1;
                }
                int minCost;
                if (f[i - 1][j] < f[i][j - 1]) {
                    minCost = f[i - 1][j] + 1;
                } else {
                    minCost = f[i][j - 1] + 1;
                }
                if (minCost > f[i - 1][j - 1] + cost) {
                    minCost = f[i - 1][j - 1] + cost;
                }
                f[i][j] = minCost;
            }
        }
        return f[dest.length()][src.length()]; 

    }
    public static void main(String[] args) {
        System.out.println(minEditDistance("kindle", "ainelw"));
    }
}

       2.C/C++版本

#include
#include
char s1[1000],s2[1000];
int min(int a,int b,int c) {
	int t = a < b ? a : b;
	return t < c ? t : c;
}
void editDistance(int len1,int len2)
{
	int** d=new int*[len1+1];
	for(int k=0;k<=len1;k++)
		d[k]=new int[len2+1];
	int i,j;
	for(i = 0;i <= len1;i++)
		d[i][0] = i;
	for(j = 0;j <= len2;j++)
		d[0][j] = j;
	for(i = 1;i <= len1;i++)
		for(j = 1;j <= len2;j++)
		{
			int cost = s1[i] == s2[j] ? 0 : 1;
			int deletion = d[i-1][j] + 1;
			int insertion = d[i][j-1] + 1;
			int substitution = d[i-1][j-1] + cost;
			d[i][j] = min(deletion,insertion,substitution);
		}
		printf("%d\n",d[len1][len2]);
		for(int k=0;i<=len1;k++)
			delete[] d[k];
		delete[] d;
}
int main()
{
	while(scanf("%s %s",s1,s2) != EOF)
		editDistance(strlen(s1),strlen(s2));
}
时间: 2024-08-02 02:46:56

动态规划之最小编辑距离问题的相关文章

Levenshein distance最小编辑距离算法实现

Levenshein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑距离,有下列的公式. 其中d[i-1,j]+1代表字符串s2插入一个字母,d[i,j-1]+1代表字符串s1删除一个字母,然后当xi=yj时,不需要代价,所以和上一步d[i-1,j-1]代价相同,否则+1,接着d[i,j]是以上三者中最小的一项. 算法实现(Python): 假设两个字符串分别为s1,

C#实现Levenshtein distance最小编辑距离算法

Levenshtein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑距离,有下列的公式. 其中d[i-1,j]+1代表字符串s2插入一个字母才与s1相同,d[i,j-1]+1代表字符串s1删除一个字母才与s2相同,然后当xi=yj时,不需要代价,所以和上一步d[i-1,j-1]代价相同,否则+1,接着d[i,j]是以上三者中最小的一项. 算法实现(C#): 假设两个

字符串最小编辑距离

首先介绍一下概念 字符串编辑距离(Edit Distance),是俄罗斯科学家 Vladimir Levenshtein在1965年提出的概念,又称 Levenshtein距离,是指两个字符串之间,由一个转成另 一个所需的最少编辑操作次数.许可的编辑操作包括 1.将一个字符替换成另一个字符 2.插入一个字符 3.删除一个字符 可以借鉴LCS的思想,采用动态规划,维护一个c[m][n]二维数组,m,n的值分别为字符串1的长度+1,字符串2的长度+1. c[0][0]表示的是二空串的编辑距离,明显为

poj3356 AGTC(经典DP最小编辑距离)

题目意思: 给出两个字符串X,Y,求出从X-->Y的最小操作次数,只可以删除,添加,修改一个字符. http://poj.org/problem?id=3356 题目分析: /** *x,y:是字符串 *动态规划最小编辑距离, *dp[i][j]表示取x的前i个字符和y的前j个字符操作的最小次数. *dp[0][j]=j:取x的前0个字符和y的前j个字符操作的 *最小次数为(j),只能添加到x * *dp[i][0]=i:取x的前i个字符和y的前0个字符操作的 *最小次数为(i),只能删除x *

最小编辑距离(Minimum edit distance)

最小编辑距离是计算欧式距离的一种方法,可以被用于计算文本的相似性以及用于文本纠错,因为这个概念是俄罗斯科学家 Vladimir Levenshtein 在1965年提出来的,所以编辑距离又称为Levenshtein距离. 简单的理解就是将一个字符串转换到另一个字符串所需要的代价(cost),付出的代价越少表示两个字符串越相似,编辑距离越小,从一个字符串转换到另一个字符串简单的归纳可以有以下几种操作,1.删除(delete)2.插入(insert)3.修改(update),其中删除和插入的代价可以

最小编辑距离

概念 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 算法 动态规划经常被用来作为这个问题的解决手段之一. 具体步骤是:1. 建立个m*n的

通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)

[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的不是很清楚,比较难理解,自己思考过后重新给大家讲解一下: 维基百科解析:莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种.指两个字串之间,由一个转成另一个所需的最少编辑操作次数.允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符.例如将kitten转成sittin

leetcode:72. 最小编辑距离

题目描述: 给定两个单词?word1 和?word2,计算出将?word1?转换成?word2 所使用的最少操作数?. 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符示例?1: 输入: word1 = "horse", word2 = "ros"输出: 3解释: horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例?2: 输入:

poj3356 字符串的最小编辑距离 dp

poj3356 字符串的最小编辑距离  dp AGTC Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10895   Accepted: 4188 Description Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given bel