编辑距离算法

来源:互联网 发布:淘宝企业店铺查假货吗 编辑:程序博客网 时间:2024/05/22 03:42

编辑距离(Edit Distance),又称Levenshtein距离,是俄罗斯科学家Vladimir Levenshtein在1965年提出的。是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将"skill"转换为"ceill"

skill——>ckill (s转换为c)

ckill——>ceill(k转换为e)

共需要两步转换,故"skill"与"ceill"的编辑距离为2

算法过程

  1. str1或str2的长度为0返回另一个字符串的长度。 if(str1.length==0) return str2.length; if(str2.length==0) return str1.length;
  2. 初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。
  3. 扫描两字符串(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三者的最小值。
  4. 扫描完后,返回矩阵的最后一个值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
原创粉丝点击