字符串编辑距离LevenshteinDistance

编辑距离

对于字符串的操作一共有三个,分别是:添加字符,删除字符,替换字符
如果我们需要把现有的字符串转换为目标字符,就需要使用以上三种操作,当我们以最少的操作将转换完成,其使用的操作步数就是两个字符串之间的编辑距离

算法图解

对于字符串a[n] = a1a2a3…an和字符串b[m] = b1b2b3…bm,来求这两个字符串的编辑距离

首先建立一个(n+1)(m+1)的二维矩阵C,先初始化C,对于C[0,i] = i,C[i,0] = i,然后我们就还剩下nm个单元未进行操作,接下来就是按照下图进行操作:
在这里插入图片描述
这就是LevenshteinDistance的运算法则,其中
在这里插入图片描述
的含义是当ai = bj时该值等于0,当ai != bj时该值等于1

该图翻译一下就是:
对于矩阵中任意的C[i,j]
if i = 0 且 j = 0 ,则C[0,0] = 0
if i = 0,则C[0,j] = j
if j = 0,则C[i,0] = i
if i ≥ 1 且 j ≥ 1 ,C[i,j] == min{ C[i-1,j] + 1, C[i,j-1] + 1, C[i-1,j-1] + f(i, j) }
当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

当我们以以上方法求出两个字符串构成的矩阵时,其编辑距离为C[n,m]

算法原理

其实LevenshteinDistance的操作有点类似于动态规划,就像汉罗塔问题一样,我们需要用最少的操作去将字符串a[n]转换为b[m],假设这最少需要k次操作,那么我们就需要用k-1次操作将
1) a[1…n] 转换为 b[1…m-1] (第k次操作添加bm)
2) a[1…n-1]转换为b[1…m] (第k次操作删除an)
3) a[1…n-1] 转换为 b [1…m-1] (第k次操作替换an为bm)
以上三种情况就是C[n,m]对应的C[n-1,m],C[n,m-1],C[n-1,m-1]三个单元,对于当ai = bj时f(i,j) = 0,实际就第三种情况,当ai = bj,我们就不用替换了,在这三种情况中我们当然选取操作数最少的赋值给C[n,m]

具体操作

在这里插入图片描述
如图,对于troop和loop建立6*5的矩阵存储数据,然后按LevenshteinDistance方法进行操作
在这里插入图片描述
所以troop与loop的编辑距离只有2

代码实现

int LevenshteinDistance(string s1,string s2)
{
	int i,j;
	int m = s1.length();
	int n = s2.length();
	int a[m+1][n+1];
	for(i = 0;i < m + 1; i ++)
		a[i][0] = i;
	for(i = 0;i < n + 1; i ++)
		a[0][i] = i;
	for(i = 1;i < m + 1; i ++)
		for(j = 1;j < n + 1; j ++)
		{
			if(s2[j-1] == s1[i-1])
				a[i][j] = Min(a[i][j - 1] + 1,a[i - 1][j] + 1,a[i - 1][j - 1]) ;
			else
				a[i][j] = Min(a[i][j - 1] + 1,a[i - 1][j] + 1,a[i - 1][j - 1] + 1);
		} 
	return a[m][n];
}

应用范围

LevenshteinDistance编辑距离可以运用输入法,对于输入错误,或者上下文不通顺的情况,可以用该算法去寻找编辑距离最近的以及使用最频繁的输入,然后对用户进行提示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Levenshtein Distance算法是一种常见的字符串相似度算法,也被称为编辑距离算法。其主要思想是通过计算两个字符串之间的编辑距离来确定它们的相似程度。 编辑距离指的是将一个字符串转换成另一个字符串所需的最少操作次数,其中每次操作可以是插入、删除或替换一个字符。例如,将字符串“kitten”转换成字符串“sitting”需要进行3次操作,即将“k”替换为“s”,将“e”替换为“i”,将“n”替换为“g”。 Levenshtein Distance算法的实现一般使用动态规划的方法,通过填充一个二维矩阵来计算两个字符串之间的编辑距离。具体实现过程可以参考以下伪代码: ``` function LevenshteinDistance(s1, s2): m = length(s1) n = length(s2) d = new matrix(m+1, n+1) for i from 0 to m: d[i, 0] = i for j from 0 to n: d[0, j] = j for j from 1 to n: for i from 1 to m: if s1[i] == s2[j]: cost = 0 else: cost = 1 d[i, j] = min(d[i-1, j]+1, d[i, j-1]+1, d[i-1, j-1]+cost) return d[m, n] ``` 在以上代码中,变量s1和s2分别表示两个待比较的字符串,m和n分别表示它们的长度,矩阵d用于存储编辑距离的计算结果。首先,将矩阵d的第一行和第一列分别初始化为0到n和0到m的整数。然后,对于每个(i, j)位置,如果s1[i]等于s2[j],则将cost设为0,否则设为1。最后,根据递推公式d[i, j] = min(d[i-1, j]+1, d[i, j-1]+1, d[i-1, j-1]+cost)来填充矩阵d,并返回d[m, n]作为编辑距离的结果。 Levenshtein Distance算法的时间复杂度为O(m*n),其中m和n分别为两个字符串的长度。在实际应用中,该算法可用于拼写检查、数据去重等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值