编辑距离及编辑距离算法 | Levenshtein距离 |DP
感谢:http://www.cnblogs.com/biyeymyhjob/archive/2012/09/28/2707343.html
加一点自己理解
编辑距离概念描述:
编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
- sitten (k→s)
- sittin (e→i)
- 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 |
状态转移,从edit(i, j) 三个方向转来
edit(i-1, j) + 1, edit(i, j-1) + 1 表示插入或删除一个字符
edit(i-1, j-1) + f(i, j) f(i,j)=0 表示不替换 f(i,j)=1表示替换1次
算是一个DP实例
#include "bits/stdc++.h"
using namespace std;
const int N=1e3+5;
int dp[N][N];
char str1[N],str2[N];
int main()
{int len1,len2;while(scanf("%s%s",str1,str2)!=EOF){len1=strlen(str1);len2=strlen(str2);for(int i=0;i<=len1;i++){dp[i][0]=i;}for(int i=0;i<=len2;i++){dp[0][i]=i;}for(int i=1;i<=len1;i++){for(int j=1;j<=len2;j++){dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(str1[i-1]!=str2[j-1]));}}for(int i=0;i<=len1;i++){for(int j=0;j<=len2;j++){printf("%d ",dp[i][j]);}puts("");}printf("%d\n",dp[len1][len2]);}return 0;
}
我们来看一个实际应用。现代搜索技术的发展很多以提供优质、高效的服务作为目标。比如说:baidu、google、sousou等知名全文搜索系统。当我们输入一个错误的query="Jave" 的时候,返回中有大量包含正确的拼写 "Java"的网页。当然这里面用到的技术绝对不会是我们今天讲的怎么简单。但我想说的是:字符串的相似度计算也是做到这一点的方法之一。
在信息检索领域的应用我们在文章开始的时候就提到了。另外,编辑距离在自然语言文本处理领域(NLP)中是计算字符串相似度的重要方法。一般而言,对于中文语句的相似度处理,我们很多时候都是将词作为一个基本操作单位,而不是字(字符)。
编辑距离及编辑距离算法 | Levenshtein距离 |DP相关推荐
- 基因序列算法:编辑距离( Levenshtein 距离)和LD算法
一. Levenshtein 距离 许多基因算法(如Wagner-Fischer 算法)基于以下观察计算编辑距离:如果我们构造一个矩阵来保存第一个字符串和第二个字符串的所有前缀,以及所有前缀之间的编辑 ...
- 莱文斯坦距离(编辑距离)算法 (Levenshtein Distance Algorithm)
什么是 莱文斯坦距离算法 (Levenshtein Distance Algorithm) ? Levenshtein Distance,莱文斯坦距离,通常被称为编辑距离(Edit Distance) ...
- 编辑距离算法和Levenshtein距离算法
前言 最近在研究diff工具的实现,已经写了一个简单的demo,不过目前这个demo只是把Levenshtein距离算法的结果用Qt可视化了出来而已,还没有实用价值,界面如下: 各种diff工具的核心 ...
- 相似度算法——Levenshtein(编辑距离)
概念 Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数. 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 编辑距离 ...
- python 编辑距离_编辑距离(Levenshtein距离)详解(附python实现)
编辑距离定义: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数. 许可的编辑操作包括:将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如 ...
- 详解编辑距离算法-Levenshtein Distance
目录 •写在前面 •什么是编辑距离? •思路 •思路可视化 •代码实现 •写在前面 编辑距离算法被数据科学家广泛应用,是用作机器翻译和语音识别评价标准的基本算法.最简单的方法是检查所有可能的编辑序列, ...
- Levenshtein 相似度算法——Levenshtein(编辑距离)
https://www.iteye.com/blog/wdhdmx-1343856 原文讲的挺有道理的: 奇妙的地方就是将字符串的对比,转换为了数值之间的计算: 相似度算法--Levenshtein( ...
- 详细剖解Levenshtein距离算法(附python实现)
在实习期间,看到同事在做文字识别的相关项目,用Levenshtein距离作为评价模型好坏的标准之一.由于是行外人,当时对这个算法并没有任何了解,只听他介绍是用来判断两个字符是否相似的一种指标吧,直到后 ...
- 编辑距离 dp_使用动态编程(DP)编辑距离
编辑距离 dp Problem: You are given two strings s1 and s2 of length M and N respectively. You can perform ...
最新文章
- Android FeceDetector(人脸识别)
- 28天打造专业红客(一)
- Spring AOP切面的时候参数的传递
- 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》
- 1231 sqlserver_sqlserver 删除表中 指定字符串
- python3版本无法加载reload解决办法NameError: name 'reload' is not defined
- 腾讯云DevOps技术揭秘:新时代运维重器Tencent Hub最佳实践
- MySQL 添加where 1= 1 是否会引起索引失效
- 2018数学建模国赛总结(A题/编程选手视角)
- 阿里云、腾讯云、华为云哪个好?迄今最全面的云服务评测报告出炉(转)
- python做算法题优势_算法优点和缺点汇总(推荐AAA)
- Windows设置开机自启动bat脚本
- 网络模型可视化工具netron
- 学生选课信息管理系统(可行性分析报告)
- Mac 下如何添加网段
- VVC帧内预测(六)MIP
- VS中使用Qt方法详解
- Nutz cnd.wrap传参
- CRM系统之如何为老客户量体裁衣
- Lora技术应用领域有哪些?