编辑距离算法
来源:互联网 发布:淘宝企业店铺查假货吗 编辑:程序博客网 时间:2024/05/22 03:42
编辑距离(Edit Distance),又称Levenshtein距离,是俄罗斯科学家Vladimir Levenshtein在1965年提出的。是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将"skill"转换为"ceill"
skill——>ckill (s转换为c)
ckill——>ceill(k转换为e)
共需要两步转换,故"skill"与"ceill"的编辑距离为2
算法过程
- str1或str2的长度为0返回另一个字符串的长度。 if(str1.length==0) return str2.length; if(str2.length==0) return str1.length;
- 初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。
- 扫描两字符串(n*m级的),如果:str1[i] == str2[j],用temp记录它,为0。否则temp记为1。然后在矩阵d[i,j]赋于d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值。
- 扫描完后,返回矩阵的最后一个值d[n][m]即是它们的距离。
1、java代码实现:
public class EditDistance {public static int getMin(int a,int b,int c){int d=a>b?b:a;return d>c?c:d;}public static int getDistance(String str1,String str2){int n=str1.length();int m=str2.length();int d[][]=new int[n+1][m+1];if(0==n)return m;if(0==m)return n;for(int i=0;i<=n;i++){d[i][0]=i;}for(int j=0;j<=m;j++){d[0][j]=j;}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(str1.charAt(i)==str2.charAt(j)){d[i + 1][j + 1] = d[i][j];}else{d[i + 1][j + 1]=getMin(d[i][j] + 1,d[i][j + 1] + 1,d[i + 1][j] + 1);}}}return d[n][m];}public static void main(String[] args) {String str1="source";String str2="cousce";System.out.println(getDistance(str1,str2));}}
2、python代码实现:
def Min(a,b,c):if(a>b):m=belse:m=areturn m if m<c else c def Distance(s1,s2):n=len(s1)m=len(s2)d=[([0]*(m+1)) for i in range(n+1)]if(n==0):return mif(m==0):return nfor i in range(n+1):d[i][0]=i;for j in range(m+1):d[0][j]=j;for i in range(n):for j in range(m):if(s1[i]==s2[j]):d[i+1][j+1] = d[i][j]else:d[i+1][j+1]=Min(d[i][j] + 1,d[i][j+1]+1,d[i+1][j]+1)return d[n][m]s1='acdef's2='abdhf'd=Distance(s1,s2)print d
3、C++代码:
#include<iostream>#include <string>using namespace std;int Min(int a,int b,int c){int m=a>b?b:a;return m>c?c:m;}int Distance(string s1,string s2){int n=s1.length(),m=s2.length();int **d=(int **)malloc((n+1) * sizeof(int *));for(int s=0;s<=n;s++){d[s] = (int *)malloc((m+1) * sizeof(int)); }if(0==n) return m;if(0==m) return n;for(int x=0;x<=n;x++){d[x][0]=x;}for(int y=0;y<=m;y++){d[0][y]=y;}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(s1.at(i)==s2.at(j))d[i+1][j+1]=d[i][j];elsed[i+1][j+1]=Min(d[i][j]+1,d[i][j+1]+1,d[i+1][j]+1);}}return d[n][m];}int main(){string s1="asdcx";string s2="acdbe";cout<<Distance(s1,s2)<<endl;return 0;}
0 0
- 编辑距离与编辑算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离及编辑距离算法
- 编辑距离算法-java
- 编辑距离算法
- 编辑距离算法实现
- 编辑距离算法
- [算法]计算编辑距离
- 字符串编辑距离算法
- 编辑距离(levenshtein)算法
- xx实体.hbm.xml 配置文件的主键生成机制说明
- 布莱恩.迪森 的发言稿
- 新的开始
- 比较 CEILING 和 FLOOR
- android软键盘输入,windowSoftInputMode
- 编辑距离算法
- 报告称中国网络文化低俗化趋势明显 存监管“真空”
- 排序算法
- 作为一名计算机学院普通的大学生如何提高兴趣敲代码?谈谈我的感受,欢迎交流
- 13-OMAPL138的双核通信组件DSPLINK开发入门
- CSS自学笔记(一)
- IE和FIREFOX在解析CSS方面的区别
- 我国将加大互联网虚假违法广告整治力度
- pdf或网页复制到word格式混乱