http://blog.csdn.net/abcjennifer/article/details/7735272

自然语言处理(NLP)中,有一个基本问题就是求两个字符串的minimal Edit Distance, 也称Levenshtein distance。受到一篇Edit Distance介绍文章的启发,本文用动态规划求取了两个字符串之间的minimal Edit Distance. 动态规划方程将在下文进行讲解。

简单地说,就是仅通过插入(insert)、删除(delete)和替换(substitute)个操作将一个字符串s1变换到另一个字符串s2的最少步骤数。熟悉算法的同学很容易知道这是个动态规划问题。

其实一个替换操作可以相当于一个delete+一个insert,所以我们将权值定义如下:

I  (insert):1

D (delete):1

S (substitute):2

2. example:

intention->execution

Minimal edit distance:

delete i ; n->e ; t->x ; insert c ; n->u 求和得cost=8

3.calculate minimal edit distance dynamically
思路见注释,这里D[i,j]就是取s1前i个character和s2前j个character所得minimal edit distance

三个操作动态进行更新:

D(i,j)=min { D(i-1, j) +1, D(i, j-1) +1 , D(i-1, j-1) + s1[i]==s2[j] ? 0 : 2};中的三项分别对应D,I,S。(详见我同学的博客

  1. /*
  2. * minEditDis.cpp
  3. *
  4. *  @Created on: Jul 10, 2012
  5. *      @Author: sophia
  6. *  @Discription: calculate the minimal edit distance between 2 strings
  7. *
  8. *  Method : DP (dynamic programming)
  9. *  D[i,j]: the minimal edit distance for s1的前i个字符和 s2的前j个字符
  10. *  DP Formulation: D[i,j]=min(D[i-1,j]+1,D[i,j-1]+1,D[i-1,j-1]+flag);//其中if(s1[i]!=s2[j])则flag=2,else flag=0;
  11. *
  12. */
  13. #include"iostream"
  14. #include"stdio.h"
  15. #include"string.h"
  16. using namespace std;
  17. #define N 100
  18. #define INF 100000000
  19. #define min(a,b) a<b?a:b
  20. int dis[N][N];
  21. char s1[N],s2[N];
  22. int n,m;//length of the two string
  23. int main()
  24. {
  25. int i,j,k;
  26. while(scanf("%s%s",&s1,&s2)!=EOF)
  27. {
  28. n=strlen(s1);m=strlen(s2);
  29. for(i=0;i<=n+1;i++)
  30. for(j=0;j<=m+1;j++)
  31. dis[i][j]=INF;
  32. dis[0][0]=0;
  33. for(i=0;i<=n;i++)
  34. for(j=0;j<=m;j++)
  35. {
  36. if(i>0) dis[i][j] = min(dis[i][j],dis[i-1][j]+1); //delete
  37. if(j>0) dis[i][j] = min(dis[i][j],dis[i][j-1]+1);//insert
  38. //substitute
  39. if(i>0&&j>0)
  40. {
  41. if(s1[i-1]!=s2[j-1])
  42. dis[i][j] = min(dis[i][j],dis[i-1][j-1]+2);
  43. else
  44. dis[i][j] = min(dis[i][j],dis[i-1][j-1]);
  45. }
  46. }
  47. printf("min edit distance is: %d\n",dis[n][m]);
  48. }
  49. return 0;
  50. }

感谢FallingStar08的提醒,上面最小化的宏定义部分改为

  1. #ifndef min
  2. #define min(a,b) (((a) < (b)) ? (a) : (b))
  3. #endif

运行结果:

intention
execution
min edit distance is: 8
abc
acbfbcd
min edit distance is: 4
zrqsophia
aihposqrz
min edit distance is: 16

另外,xuhanqiu在下面的提示也很有意义:

coursera
上老师讲substitute的cost=2默认了substitute =
delete+insertion,而这样违反了三角不等式即dis(a,b)+dis(a,c)>dis(b,c),这样一来sustitute
就失去了存在的意义,所以如果存在三个基本操作delete,insert和substitute,我们应当把substitute
cost改为1,而上面的代码对应于基本操作仅有delete和insertion的情况。当然,实际中有很多变体,具体问题具体分析。

Reference:

1. https://www.coursera.org/course/nlp

2. http://blog.csdn.NET/huaweidong2011/article/details/7727482

动态规划 求解 Minimum Edit Distance的更多相关文章

  1. 编辑距离(Minimum Edit Distance)

    编辑距离(Minimum Edit Distance,MED),也叫 Levenshtein Distance.他的含义是计算字符串a转换为字符串b的最少单字符编辑次数.编辑操作有:插入.删除.替换( ...

  2. Minimum edit distance(levenshtein distance)(最小编辑距离)初探

    最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离.是指两个字串之间,由一个转成还有一个所需的最少编辑操作次数.许可的编辑操作包含将一个字符替换成还有一个字符. ...

  3. stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)

    I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...

  4. Min Edit Distance

    Min Edit Distance ----两字符串之间的最小距离 PPT原稿参见Stanford:http://www.stanford.edu/class/cs124/lec/med.pdf Ti ...

  5. 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance

    引言 二维动态规划中最常见的是棋盘型二维动态规划. 即 func(i, j) 往往只和 func(i-1, j-1), func(i-1, j) 以及 func(i, j-1) 有关 这种情况下,时间 ...

  6. Edit Distance问题在两种编程范式下的求解

    本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...

  7. Edit Distance——经典的动态规划问题

    题目描述Edit DistanceGiven two words word1 and word2, find the minimum number of steps required to conve ...

  8. Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance)

    Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可 ...

  9. 【leetcode】Edit Distance

    Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert  ...

随机推荐

  1. Keepalived+Redis高可用部署

    1   Redis简介及安装 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数 ...

  2. [weird problem] the xm file transfered by wcf,some sections in it were always repeated

    some sections in xml are always repeated,I received these file by wcf. I thought it's caused by buff ...

  3. android listview 的监听事件

    今天遇到了一个比较让我头疼的问题,不过追根揭底只是我对listview理解的不够透彻罢了, 闲言少叙,说说我遇到的问题吧: 上篇随笔我写了关于listview的使用,如果你也已经写好了列表那么恭喜这一 ...

  4. linux 常用命令总结

    PS命令: 1.命令格式: ps[参数] 2.命令功能: 用来显示当前进程的状态 3.命令参数: a  显示所有进程 -a 显示同一终端下的所有程序 -A 显示所有进程 c  显示进程的真实名称 -N ...

  5. Bete冲刺第三阶段

    Bete冲刺第三阶段 今日工作: web: 检索了各类资料,今日暂时顺利解决了hibernate懒加载异常的问题,采用的凡是也比较简单就是添加了一个OpenSessionInViewFilter的过滤 ...

  6. [转] EJB到底是什么,真的那么神秘吗??

    原文地址:http://blog.csdn.net/jojo52013145/article/details/5783677 1. 我们不禁要问,什么是"服务集群"?什么是&quo ...

  7. git 保存用户名和密码

    打开TortoiseGit控制面板 点击 Edit global .gitconfig文件 添加 [credential] helper = store OK了 你再登录一次之后密码就被记住了

  8. 【POJ 2406】Power Strings 连续重复子串

    看的<后缀数组——处理字符串的有力工具>这篇论文,在那里这道题是用后缀数组实现的,复杂度为$O(nlogn)$,很明显长度为$2×10^6$的数据会TLE,所以必需得用复杂度为$O(n)$ ...

  9. static 静态导包

    静态导入 ArrayUtils 类的 INDEX_NOT_FOUND 属性和 add 方法 import static org.apache.commons.lang3.ArrayUtils.INDE ...

  10. 扩展easyUI tab控件,添加加载遮罩效果

    项目里要用HighChart显示图表,如果返回的数量量太多,生成图表是一个很耗时的过程.tab控件又没有显示遮罩的设置(至少本菜是没有找到), Google了一下,根据另一个兄台写的方法,拿来改造了一 ...