最小编辑距离

概念

编辑距离(Edit
Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

sitten (k→s)

sittin (e→i)

sitting (→g)

俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。

算法

动态规划经常被用来作为这个问题的解决手段之一。

具体步骤是:
1.
建立个m*n的矩阵matrix,其中m=len(a)+1n=len(b)+1。这样,二维数组的范围就是
matrix[0...n-1][0...m-1]了。
2.
给matrix[0][0...m-1]赋值为0...m-1matrix[0...n-1][0]赋值为0...n-1
3.
遍历matrix[0...n-1][0...m-1]
matrix每个元素的值都为:
min\left\{\begin{array}{lll}matrix[i-1][j]+INSERT\_COST
\\matrix[i][j-1]+DELETE\_COST\\matrix[i-1][j-1]+SUBSTITUTE\_COST(source_i
target_j)\end{array} \right.
其中,INSERT_COST,DELETE_COST
都是固定值(可以自己设定12什么的)。
而SUBSTITUTE_COST是需要判断的。
当source_i和target_i的值是等价的时候,SUBSTITUTE_COST就是0否则SUBSTITUTE_COST就是预定义的一个权值。
最后matrix[n-1][m-1]的值则为两个字符串的最小编辑距离。
改进
当source_i和target_i的值相同时,SUBSTITUTE_COST的值就是0,必然是最小值。所以首先判断两字符是否相等,若相等则直接判定matrix[i][j]=matrix[i-1][j-1],判断下个。这样可以省很多计算。

伪代码:

整数 Levenshtein距离(字符串 str1[1..m], 字符串 str2[1..n])

//声明变量, d[i , j]用于记录str1[1...i]与str2[1..j]的Levenshtein距离

int d[0..m, 0..n]

//初始化

for i from 0 to m

d[i, 0] := i

for j from 0 to n

d[0, j] := j

//用动态规划方法计算Levenshtein距离

for i from 1 to m

for j from 1 to n

{

//计算替换操作的代价,如果两个字符相同,则替换操作代价为0,否则为1

if str1[i]== str2[j] then cost := 0

else cost := 1

//d[i,j]的Levenshtein距离,可以有

d[i, j] := minimum(

d[i-1, j] + 1,  //在str1上i-1位置插入字符(或者在str2上j位置删除字符)

d[i, j-1] + 1,  //在str1上i位置删除字符(或者在str2上j-1位置插入字符)

d[i-1, j-1] + cost // 替换操作

)

}

//返回d[m, n]

return d[m, n]

wikisource上有不同的编程语言的版本。

java代码实现

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

package
com.mzule.al;

public class LevenshteinDistance {

    public
double distance(String w1,String w2){

        double[][] m = new
double[w1.length()+1][w2.length()+1];

        for(int
i=0;i<m.length;i++){

            m[i][0]=i;

        }

        for(int
i=0;i<m[0].length;i++){

            m[0][i]=i;

        }

        for(int
i=1;i<m.length;i++){

            for(int
j=1;j<m[0].length;j++){

                m[i][j] = min(m[i][j-1]+1,m[i-1][j]+1,m[i-1][j-1]+cost(w1.charAt(i-1),w2.charAt(j-1)));

            }

        }

        return
m[w1.length()][w2.length()];

    }

    protected
double cost(char
c1,char c2) {

        return
c1==c2?0:1;

    }

    protected
double min(double
i, double
j, double
k) {

        double
t = i<j?i:j;

        return
t<k?t:k;

    }

    

}

  测试代码:

?





1

2

3

4

public static void main(String[] args) {

    double
d = new LevenshteinDistance().distance("Lavensting", "Levenshtein");

    System.out.println(d);

}

  来源:http://www.cnblogs.com/codeplus/p/3392232.html

时间: 2024-07-30 18:04:08

最小编辑距离的相关文章

Levenshein distance最小编辑距离算法实现

Levenshein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑距离,有下列的公式. 其中d[i-1,j]+1代表字符串s2插入一个字母,d[i,j-1]+1代表字符串s1删除一个字母,然后当xi=yj时,不需要代价,所以和上一步d[i-1,j-1]代价相同,否则+1,接着d[i,j]是以上三者中最小的一项. 算法实现(Python): 假设两个字符串分别为s1,

C#实现Levenshtein distance最小编辑距离算法

Levenshtein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑距离,有下列的公式. 其中d[i-1,j]+1代表字符串s2插入一个字母才与s1相同,d[i,j-1]+1代表字符串s1删除一个字母才与s2相同,然后当xi=yj时,不需要代价,所以和上一步d[i-1,j-1]代价相同,否则+1,接着d[i,j]是以上三者中最小的一项. 算法实现(C#): 假设两个

字符串最小编辑距离

首先介绍一下概念 字符串编辑距离(Edit Distance),是俄罗斯科学家 Vladimir Levenshtein在1965年提出的概念,又称 Levenshtein距离,是指两个字符串之间,由一个转成另 一个所需的最少编辑操作次数.许可的编辑操作包括 1.将一个字符替换成另一个字符 2.插入一个字符 3.删除一个字符 可以借鉴LCS的思想,采用动态规划,维护一个c[m][n]二维数组,m,n的值分别为字符串1的长度+1,字符串2的长度+1. c[0][0]表示的是二空串的编辑距离,明显为

poj3356 字符串的最小编辑距离 dp

poj3356 字符串的最小编辑距离  dp AGTC Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10895   Accepted: 4188 Description Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given bel

poj3356 AGTC(经典DP最小编辑距离)

题目意思: 给出两个字符串X,Y,求出从X-->Y的最小操作次数,只可以删除,添加,修改一个字符. http://poj.org/problem?id=3356 题目分析: /** *x,y:是字符串 *动态规划最小编辑距离, *dp[i][j]表示取x的前i个字符和y的前j个字符操作的最小次数. *dp[0][j]=j:取x的前0个字符和y的前j个字符操作的 *最小次数为(j),只能添加到x * *dp[i][0]=i:取x的前i个字符和y的前0个字符操作的 *最小次数为(i),只能删除x *

最小编辑距离(Minimum edit distance)

最小编辑距离是计算欧式距离的一种方法,可以被用于计算文本的相似性以及用于文本纠错,因为这个概念是俄罗斯科学家 Vladimir Levenshtein 在1965年提出来的,所以编辑距离又称为Levenshtein距离. 简单的理解就是将一个字符串转换到另一个字符串所需要的代价(cost),付出的代价越少表示两个字符串越相似,编辑距离越小,从一个字符串转换到另一个字符串简单的归纳可以有以下几种操作,1.删除(delete)2.插入(insert)3.修改(update),其中删除和插入的代价可以

Minimum edit distance(levenshtein distance)(最小编辑距离)初探

最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten(k→s) sittin(e→i) sitting(→g) 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. Thewords `computer' and `commuter' are

通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)

[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的不是很清楚,比较难理解,自己思考过后重新给大家讲解一下: 维基百科解析:莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种.指两个字串之间,由一个转成另一个所需的最少编辑操作次数.允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符.例如将kitten转成sittin

leetcode:72. 最小编辑距离

题目描述: 给定两个单词?word1 和?word2,计算出将?word1?转换成?word2 所使用的最少操作数?. 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符示例?1: 输入: word1 = "horse", word2 = "ros"输出: 3解释: horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例?2: 输入: