[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 

  最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的不是很清楚,比较难理解,自己思考过后重新给大家讲解一下;

  维基百科解析:莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten转成sitting:

sitten (k→s)
sittin  (e→i)
sitting(→g)
俄罗斯科学家弗拉基米尔·莱文斯坦在1965年提出这个概念。

  意思很好明白,这东西主要用在文本相似度匹配上就是通过这个最小距离来判断两个文本相似度情况,ES临近搜索(match_phrase)的打分也是基于这个编辑距离进行的,编辑距离越小则表示文本越接近,那么现在就是要求出最小的编辑距离。

  先给出计算公式再解析原理:

假如两个字符串分别是String A="abc"和String B="abbf"做成一个二维数组 i代表B的序号[行],j代表A的序号[列],i或者j等于0的时候代表大家都是空字符串

  0 a b c
0        
a        
b        
b        
f        

1.如果i=0或者j=0,edit(i,j)=j或者i

2.如果i&&j>=1 则edit(i,j)=min{edit(i-1,j)+1,edit(i,j-1)+1,edit(i-1,j-1)+x} 如果B[i]=A[j]相等,则x=0,否则x=1;

  其实思想就是基于上一个状态的最小距离,推出下一个的最小距离,对于两个数据A,B来说,如何找出他们的上一个状态呢,其实穷举一下就可以了假设当前状态大家都是一个字符A="a",B="a",那么他们上一个状态有以下3种情况,A="",B="a"|A="a",B=""|A="",B=""对应其实就是 edit(i-1,j)|edit(i,j-1)|edit(i-1,j-1),在表结构对应的位置就是当前位置的上|左|右上。而对于edit(i-1,j)|edit(i,j-1)这两种情况无论怎么样,他们要转换到当前状态至少都要加1的编辑距离,例如A="",B="a"变到A="a",B="a" A要增加1个编辑距离,而对于edit(i-1,j-1)如果edit(i,j)中i对应的字符等于j其实是不用增加编辑距离的,例如A="",B=""到A="a",B="a",时原本的编辑距离是0,现在还是0,但如果i,j对应的字符不相等,例如A="ab",B="ab"到A="abb",B="abc",其实是从原来的编辑距离是0,变成了1,所以最小编辑距离应该是上一个编辑距离edit(i-1,j-1)+1 ,理解这个推理就理解情况2了,理解情况2,情况1一看就知道这里不解析了,然后就可以按这个思想推出下面的表

条件1时:

  0 a b c
0 0 1 2 3
a 1      
b 2      
b 3      
f 4      

  

递推执行条件2:

  0 a b c
0 0 1 2 3
a 1 0    
b 2 1    
b 3 2    
f 4 3    
  0 a b c
0 0 1 2 3
a 1 0 1  
b 2 1 0  
b 3 2 1  
f 4 3 2  
  0 a b c
0 0 1 2 3
a 1 0 1 2
b 2 1 0 1
b 3 2 1 1
f 4 3 2 2

  看到这里如果还觉得不够清楚的话,自己对着上面的表格自己尝试一个一个计算一下最小编辑距离,随着字符的增加,你一定会发现跟上一个状态的字符编辑距离是有关系的,这里再说一点,为什么我们都是只做加1而不是加2加3,是因为假如上一个字符对的编辑距离是x,这个字符对任意一个字符的增加最多只会增加1个编辑距离,如果还理解不了还是自己对着表个去一个一个字符往上加对比就会发现规律。

  以上就是我的通俗讲解,至于代码实现我觉得大家理解了之后应该都会写,就不在这增加篇幅了,网上也很多,大家可以找找。

通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)的更多相关文章

  1. Levenshtein Distance莱文斯坦距离算法来计算字符串的相似度

    Levenshtein Distance莱文斯坦距离定义: 数学上,两个字符串a.b之间的莱文斯坦距离表示为levab(|a|, |b|). levab(i, j) = max(i, j)  如果mi ...

  2. iOS:使用莱文斯坦距离算法计算两串字符串的相似度

    Levenshtein:莱文斯坦距离 Levenshtein的经典算法,参考http://en.wikipedia.org/wiki/Levenshtein_distance的伪代码实现的,同时参考了 ...

  3. Levenshtein莱文斯坦算法在项目中的应用

    简介 根据维基百科的描述,在信息理论.语言学和计算机科学中,莱文斯坦距离是一个测量两个序列之间差异的字符串度量.非正式地,两个单词之间的莱文斯坦距离是将一个单词改变为另一个单词所需的最小单字符编辑次数 ...

  4. Levenshtein Distance(编辑距离)算法与使用场景

    前提 已经很久没深入研究过算法相关的东西,毕竟日常少用,就算死记硬背也是没有实施场景导致容易淡忘.最近在做一个脱敏数据和明文数据匹配的需求的时候,用到了一个算法叫Levenshtein Distanc ...

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

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

  6. 利用Levenshtein Distance (编辑距离)实现文档相似度计算

    1.首先将word文档解压缩为zip /** * 修改后缀名 */ public static String reName(String path){ File file=new File(path) ...

  7. Levenshtein Distance算法(编辑距离算法)

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

  8. 字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)

    在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...

  9. 扒一扒编辑距离(Levenshtein Distance)算法

    最近由于工作需要,接触了编辑距离(Levenshtein Distance)算法.赶脚很有意思.最初百度了一些文章,但讲的都不是很好,读起来感觉似懂非懂.最后还是用google找到了一些资料才慢慢理解 ...

随机推荐

  1. error: Please reinstall the libzip distribution

    安装中遇到的问题 在运行 ./configure 时,提示: Please reinstall the libzip distribution 是因为 libzip 版本过低,编译升级 先卸载了原先的 ...

  2. vue 路由知识点(一级路由与二级路由嵌套)

    本人小白一个,如果问题,麻烦大神指点, 一级路由: path:'/' 默认为显示; 二级路由: path: '',默认显示为index组件,因为二级路有没有写index组件,所以使用redirect: ...

  3. layui 的基本使用介绍

    全局配置 layui.config({ dir: '/res/layui/' //layui.js 所在路径(注意,如果是script单独引入layui.js,无需设定该参数.),一般情况下可以无视 ...

  4. HTTP协议(2)

    HTTP协议主要是有HTTP请求报文和HTTP响应报文组成的. HTTP请求报文主要分为四个部分: 第一部分:请求行.独占一行,由请求方法.请求url以及协议/版本组成: 第二部分:请求头,第二行到第 ...

  5. 关于spring @scope("prorotype") 和 @aspectj 一起用的问题

    前段时间听别人说prototype 模式的bean用@Aspectj做AOP会导致内存泄漏, 于是自己研究了下总结出几点 1.aspectj  如果是采用javac 编译  会动态产生代理类 代理类是 ...

  6. 云计算之路-出海记:蹭一张 aws 船票

    出海记开篇之后,在 aws 上搭建博客园海外站的出海计划今天开始迈出第一步 -- 注册一个 aws 海外区域账号. aws 现在针对新注册用户提供12个月免费套餐(正在园子里推广并提供了专属注册通道) ...

  7. 4G DTU在使用时有哪些注意事项?

    4G DTU是用来帮助工业设备快速连接4G网络的设备.众山物联网研发.生产的LTE660正是这样一款功能强大的4G联网"利器". DTU是英文Data Transfer unit的 ...

  8. (一)http协议介绍

    HTTP协议详解 (一) 介绍 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本 ...

  9. wamp&花生壳 在本地搭建自己的网站

    1.wamp下载安装(2.49),按提示来. 唯一要注意的是默认端口为80,若80端口已被占用,修改apache配置文件httpd.conf(C:\wamp\bin\apache\apache2.4. ...

  10. php之4个坐标点判断是否为矩形和正方形

    代码 <?php $a=[0,0]; $b=[0,1]; $c=[1,1]; $d=[1,0]; $ar=array($a,$b,$c,$d); $a1=[]; // 0 1 2 3 forea ...