最短编辑距离算法(字符串比较)

一、编辑距离

1、从字符串a变为字符串b所需要的元操作有3种:

  1. 增加一个字符
  2. 删除一个字符
  3. 变化一个字符

2、编辑距离:从字符串a变为b所需要的最少操作步骤。

二、最短编辑距离(动态规划)

首先定义一个函数——step(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。

显然可以有如下动态规划公式:

  • if i == 0 且 j == 0,step(i, j) = 0
  • if i == 0 且 j > 0,step(i, j) = j
  • if i > 0 且j == 0,step(i, j) = i
  • if i ≥ 1  且 j ≥ 1 ,step(i, j) == min{ step(i-1, j) + 1, step(i, j-1) + 1, step(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

P1:初始化如下矩阵

P2:计算step(1, 1),step(0, 1) + 1 == 2,step(1, 0) + 1 == 2,step(0, 0) + f(1, 1) == 0 + 1 == 1,min(step(0, 1),step(1,
0),step(0, 0) + f(1, 1))==1,因此step(1, 1) == 1。 依次类推:

从上图可以看出从hug---->huge的最短编辑距离为1.Java实现如下:

/**
 * 最短编辑距离算法
 */
public class Levenshtein {

	/**
	 * 获取两字符串的相似度
	 * @param source 初始串
	 * @param target 比较串
	 * @return 相似度
	 */
	public static float getSimilarityRatio(String source, String target) {
		return 1 - (float) compare(source, target) / Math.max(source.length(), target.length());
	}

	private static int compare(String source, String target) {

		int matrix[][];
		int n = source.length();
		int m = target.length();
		int i; //source索引
		int j; //target索引
		char ch1;
		char ch2;
		int temp; //记录相同字符,值为0/1

		if (n == 0)
			return m;

		if (m == 0)
			return n;

		matrix = new int[n + 1][m + 1];
		for (i = 0; i <= n; i++) { //初始化第一列
			matrix[i][0] = i;
		}

		for (j = 0; j <= m; j++) { //初始化第一行
			matrix[0][j] = j;
		}

		for (i = 1; i <= n; i++) { //遍历source
			ch1 = source.charAt(i - 1);
			//匹配target
			for (j = 1; j <= m; j++) {
				ch2 = target.charAt(j - 1);
				if (ch1 == ch2) temp = 0;
				else temp = 1;
				//左+1,上+1,左上+temp 取最小
				matrix[i][j] = min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + temp);
			}
		}
		return matrix[n][m];
	}

	private static int min(int one, int two, int three) {
		return (one = one < two ? one : two) < three ? one : three;
	}

	public static void main(String[] args) {
		String source = "中国";
		String target = "中国人";
		System.out.println("similarityRatio=" + Levenshtein.getSimilarityRatio(source, target));
	}
}
时间: 2024-10-09 10:49:57

最短编辑距离算法(字符串比较)的相关文章

最短编辑距离算法

一般情况下,电商在当客户输入一个不存在的商品时,会返回客户一个与客户输入最为接近的商品,并加以提示"您是不是在找XXX?".这其中用到了一种算法,叫做"最短编辑距离算法",能在一大堆已存在的字符串中找到与原字符串最为接近的那个字符串,称之为最短编辑距离. 这种算法是基于动态规划思想,下面是算法的思路描述: 描述: 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: (1)删除一个字符; (2)插入一个字符: (3)将一个字符改

最短编辑距离算法实现

一,算法介绍 在CS124课程的第一周提到 求解两个字符串相似度的算法---Minimum Edit Distance(最短编辑距离)算法.该算法在NLP(自然语言处理)中也会用到. 如何定义相似度呢?任给两个字符串X 和Y,使用以下三种操作将 字符串X 变到 字符串Y  :①插入(Insert)操作:②删除操作(delete):③替换操作(substitute) 比如 字符串X="intention" ,  字符串Y="execution".从字符串X 转换成 字

算法题目: 动态规划 之 最短编辑距离

问题: 对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和.2个非空格字符的距离是它们的ASCII码之差的绝对值:空格与空格的距离为0,空格与其他字符的距离为一个定值k.在一般情况下,字符串A和B的长度不一定相同.字符串A的扩展是在A中插入若干空格字符所产生的字符串.在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离.对于给定的字符串A和B,设计一个算法,计算其扩展距离. 测试数据: 输入:cmc      snmn        2   

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

在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 俄罗斯科学家V

[算法]字符串编辑距离

来自编程之美的一题 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程序.我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”); 2.增加一个字符(如把“abdd”变为“aebdd”); 3.删除一个字符(如把“travelling”变为“traveling”); 比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的.上面的两种方案,都仅需要一 次

编辑距离算法详解:Levenshtein Distance算法

算法基本原理:假设我们可以使用d[ i , j ]个步骤(可以使用一个二维数组保存这个值),表示将串s[ 1…i ] 转换为 串t [ 1…j ]所需要的最少步骤个数,那么,在最基本的情况下,即在i等于0时,也就是说串s为空,那么对应的d[0,j] 就是 增加j个字符,使得s转化为t,在j等于0时,也就是说串t为空,那么对应的d[i,0] 就是 减少 i个字符,使得s转化为t. 然后我们考虑一般情况,加一点动态规划的想法,我们要想得到将s[1..i]经过最少次数的增加,删除,或者替换操作就转变为

Levenshtein distance 编辑距离算法

这几天再看 virtrual-dom,关于两个列表的对比,讲到了 Levenshtein distance 距离,周末抽空做一下总结. Levenshtein Distance 介绍 在信息理论和计算机科学中,Levenshtein 距离是用于测量两个序列之间的差异量(即编辑距离)的度量.两个字符串之间的 Levenshtein 距离定义为将一个字符串转换为另一个字符串所需的最小编辑数,允许的编辑操作是单个字符的插入,删除或替换. 例子 ‘kitten’和’sitten’之间的 Levensht

编辑距离算法(Levenshtein)

编辑距离定义: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数. 许可的编辑操作包括:将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将eeba转变成abac: eba(删除第一个e) aba(将剩下的e替换成a) abac(在末尾插入c) 所以eeba和abac的编辑距离就是3 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 算法: 算法就是简单的线性动态规划(最长上升子序列就属于线性动态规划).

编辑距离算法 (二)摘自网络

/** * 编辑距离算法,首先由俄国科学家Levenshtein提出的,又叫Levenshtein Distance * 主要用来计算从原串(s)转换到目标串(t)所需要的最少的插入,删除和替换的数目, 在NLP中应用比较广泛,同时也常用来计算你对原文所作的改动数 */ public class Levenshtein { private int compare(String str, String target) { int d[][]; // 矩阵 int n = str.length();