`
gk23
  • 浏览: 176356 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编辑距离(Edit Distance)算法理论

阅读更多

Refrence :        Dynamic Programming Algorithm (DPA) for Edit-Distance

编辑距离

 

       关于两个字符串s1,s2的差别,可以通过计算他们的最小编辑距离来决定。

 

       所谓的编辑距离: s1s2变成相同字符串需要下面操作的最小次数。

 

1.         把某个字符ch1变成ch2

 

2.         删除某个字符

 

3.         插入某个字符

 

例如      s1 = “12433” s2=”1233”;

 

                     则可以通过在s2中间插入4得到12433s1一致。

 

                   d(s1,s2) = 1 (进行了一次插入操作)

 

编辑距离的性质

 

计算两个字符串s1+ch1, s2+ch2编辑距离有这样的性质:

 

1.         d(s1,””) = d(“”,s1) = |s1|    d(“ch1”,”ch2”) = ch1 == ch2 ? 0 : 1;

 

2.         d(s1+ch1,s2+ch2) = min(     d(s1,s2)+ ch1==ch2 ? 0 : 1 ,

 

d(s1+ch1,s2)+1,

 

d(s1,s2+ch2) +1);

 

              第一个性质是显然的。

 

              第二个性质:          由于我们定义的三个操作来作为编辑距离的一种衡量方法。

 

                                          于是对ch1,ch2可能的操作只有

 

1.         ch1变成ch2

 

2.         s1+ch1后删除ch1              d = (1+d(s1,s2+ch2))

 

3.         s1+ch1后插入ch2              d = (1 + d(s1+ch1,s2))

 

                                          对于23的操作可以等价于:

 

                                          _2.   s2+ch2后添加ch1              d=(1+d(s1,s2+ch2))

 

                                          _3.   s2+ch2后删除ch2              d=(1+d(s1+ch1,s2))

 

                     因此可以得到计算编辑距离的性质2

 

复杂度分析

 

从上面性质2可以看出计算过程呈现这样的一种结构(假设各个层用当前计算的串长度标记,并假设两个串长度都为 n )

 

 

 

 

可以看到,该问题的复杂度指数级别 3 n 次方,对于较长的串,时间上是无法让人忍受的。

 

       分析:     在上面的结构中,我们发现多次出现了 (n-1,n-1), (n-1,n-2)……。换句话说该结构具有重叠子问题。再加上前面性质2所具有的最优子结构。符合动态规划算法基本要素。因此可以使用动态规划算法把复杂度降低到多项式级别

 

动态规划求解

 

       首先为了避免重复计算子问题,添加两个辅助数组。

 

一.     保存子问题结果。

 

M[ |s1| ,|s2| ] , 其中M[ i , j ] 表示子串 s1(0->i) s2(0->j) 的编辑距离

 

二.     保存字符之间的编辑距离.

 

E[ |s1|, |s2| ] , 其中 E[ i, j ] = s[i] = s[j] ? 0 : 1

 

       .   新的计算表达式

 

根据性质1得到

 

M[ 0,0] = 0;

 

M[ s1i, 0 ] = |s1i|;

 

M[ 0, s2j ] = |s2j|;

 

根据性质2得到

 

M[ i, j ]   = min(     m[i-1,j-1] + E[ i, j ] ,

 

                            m[i, j-1]+1 ,

 

                            m[i-1, j] +1 );

 

       复杂度

 

              从新的计算式看出,计算过程为

 

              i=1 -> |s1|

 

                     j=1 -> |s2|

 

                            M[i][j] = ……

 

              因此复杂度为 O( |s1| * |s2| ) ,如果假设他们的长度都为n,则复杂度为 O(n^2)

 

 

  Reference: Dynamic Programming Algorithm (DPA) for Edit-DistanceThe words `computer' and `commuter' are very similar, and a change of just one letter, p->m will change the first word into the second. The word `sport' can be changed into `spot' by the deletion of the `p', or equivalently, `spot' can be changed into `sport' by the insertion of `p'.
  The edit distance of two strings, s1 and s2, is defined as the minimum number of point mutations required to change s1 into s2, where a point mutation is one of:
  change a letter, insert a letter or delete a letter
  The following recurrence relations define the edit distance, d(s1,s2), of two strings s1 and s2:
  d('', '') = 0
  d(s, '') = d('', s) = |s| -- i.e. length of s
  d(s1+ch1, s2+ch2)
   = min( d(s1, s2) + if ch1=ch2 then 0 else 1 fi,
   d(s1+ch1, s2) + 1,
   d(s1, s2+ch2) + 1 )
  The first two rules above are obviously true, so it is only necessary consider the last one. Here, neither string is the empty string, so each has a last character, ch1 and ch2 respectively. Somehow, ch1 and ch2 have to be explained in an edit of s1+ch1 into s2+ch2. If ch1 equals ch2, they can be matched for no penalty, i.e. 0, and the overall edit distance is d(s1,s2). If ch1 differs from ch2, then ch1 could be changed into ch2, i.e. 1, giving an overall cost d(s1,s2)+1. Another possibility is to delete ch1 and edit s1 into s2+ch2, d(s1,s2+ch2)+1. The last possibility is to edit s1+ch1 into s2 and then insert ch2, d(s1+ch1,s2)+1. There are no other alternatives. We take the least expensive, i.e. min, of these alternatives.
  The recurrence relations imply an obvious ternary-recursive routine. This is not a good idea because it is exponentially slow, and impractical for strings of more than a very few characters.
  Examination of the relations reveals that d(s1,s2) depends only on d(s1',s2') where s1' is shorter than s1, or s2' is shorter than s2, or both. This allows the dynamic programming technique to be used.
  A two-dimensional matrix, m[0..|s1|,0..|s2|] is used to hold the edit distance values:
  m[i,j] = d(s1[1..i], s2[1..j])
  m[0, 0] = 0
  m[i, 0] = i, i=1..|s1|
  m[0, j] = j, j=1..|s2|
  m[i,j] = min( m[i-1,j-1]
   + if s1[i]=s2[j] then 0 else 1 fi,
   m[i-1, j] + 1,
   m[i, j-1] + 1 ), i=1..|s1|, j=1..|s2|
  m[,] can be computed row by row. Row m[i,] depends only on row m[i-1,]. The time complexity of this algorithm is O(|s1|*|s2|). If s1 and s2 have a `similar' length, about `n' say, this complexity is O(n2), much better than exponential!
  The words `computer' and `commuter' are very similar, and a change of just one letter, p->m will change the first word into the second. The word `sport' can be changed into `spot' by the deletion of the `p', or equivalently, `spot' can be changed into `sport' by the insertion of `p'.
  The edit distance of two strings, s1 and s2, is defined as the minimum number of point mutations required to change s1 into s2, where a point mutation is one of:
  change a letter, insert a letter or delete a letter
  The following recurrence relations define the edit distance, d(s1,s2), of two strings s1 and s2:
  d('', '') = 0
  d(s, '') = d('', s) = |s| -- i.e. length of s
  d(s1+ch1, s2+ch2)
   = min( d(s1, s2) + if ch1=ch2 then 0 else 1 fi,
   d(s1+ch1, s2) + 1,
   d(s1, s2+ch2) + 1 )
  The first two rules above are obviously true, so it is only necessary consider the last one. Here, neither string is the empty string, so each has a last character, ch1 and ch2 respectively. Somehow, ch1 and ch2 have to be explained in an edit of s1+ch1 into s2+ch2. If ch1 equals ch2, they can be matched for no penalty, i.e. 0, and the overall edit distance is d(s1,s2). If ch1 differs from ch2, then ch1 could be changed into ch2, i.e. 1, giving an overall cost d(s1,s2)+1. Another possibility is to delete ch1 and edit s1 into s2+ch2, d(s1,s2+ch2)+1. The last possibility is to edit s1+ch1 into s2 and then insert ch2, d(s1+ch1,s2)+1. There are no other alternatives. We take the least expensive, i.e. min, of these alternatives.
  The recurrence relations imply an obvious ternary-recursive routine. This is not a good idea because it is exponentially slow, and impractical for strings of more than a very few characters.
  Examination of the relations reveals that d(s1,s2) depends only on d(s1',s2') where s1' is shorter than s1, or s2' is shorter than s2, or both. This allows the dynamic programming technique to be used.
  A two-dimensional matrix, m[0..|s1|,0..|s2|] is used to hold the edit distance values:
  m[i,j] = d(s1[1..i], s2[1..j])
  m[0, 0] = 0
  m[i, 0] = i, i=1..|s1|
  m[0, j] = j, j=1..|s2|
  m[i,j] = min( m[i-1,j-1]
   + if s1[i]=s2[j] then 0 else 1 fi,
   m[i-1, j] + 1,
   m[i, j-1] + 1 ), i=1..|s1|, j=1..|s2|
  m[,] can be computed row by row. Row m[i,] depends only on row m[i-1,]. The time complexity of this algorithm is O(|s1|*|s2|). If s1 and s2 have a `similar' length, about `n' say, this complexity is O(n2), much better than exponential!

分享到:
评论

相关推荐

    SQL SERVER实现编辑距离(Edit Distance)算法

    编辑距离(Edit Distance)算法,也被称作Levenshtein距离算法,是一种用于字符串之间模糊匹配的常用方法。在SQL Server数据库中,我们可以通过创建一个函数来实现Levenshtein距离算法,进而进行字符串的比较和...

    编辑距离 EditDistance

    编辑距离(Edit Distance)是一种衡量两个字符串相似度的算法,广泛应用于文本处理、生物信息学等领域。这个算法基于这样的思想:通过插入、删除、替换等操作将一个字符串转换成另一个字符串,计算最少需要多少次...

    编辑距离EditDistance C代码实现

    动态规划 编辑距离 可以用来判别字符串的差异

    编辑距离EditDistance

    在给出的文件`EditDistance`中,很可能是C语言实现的编辑距离算法源代码。通过阅读和理解这个代码,你可以更深入地了解编辑距离的计算过程,并且可以学习如何将理论知识转化为实际的编程实现。如果你对C语言或编辑...

    Edit Distance 编辑距离

    算法中的edit distance问题 给出原序列 再给出目的序列 程序描述出源到目的的转换 编译通过了 本人的算法作业!

    ld.rar_LD算法_edit distance_最小编辑距离_编辑距离

    标签中的“ld算法”、“edit_distance”、“最小编辑距离”和“编辑距离”都是对同一个概念的不同表述,即上述的莱文斯坦距离。 压缩包中的文件“www.pudn.com.txt”可能是某个网站或论坛上关于这个话题的讨论记录...

    一个简单的字符串Edit Distance C#程序

    在C#中实现Edit Distance算法可以帮助我们解决许多实际问题,比如拼写纠错、字符串匹配等。以下是对这个主题的详细解释: 1. **Edit Distance算法原理** Edit Distance算法的核心思想是通过动态规划来求解。创建一...

    editdistance:快速实现编辑距离(Levenshtein距离)

    编辑距离 快速实现编辑距离(Levenshtein距离)。 该库仅使用C ++和Cython实现。 该库中使用的算法由提出 。 二元轮 多亏了 ,Linux,Mac OS和Windows上都有二进制轮子。 安装 您可以通过pip安装: pip install ...

    edit distance算法

    用python 实现的编辑距离算法,支持权重的定义,和词语之间的关联

    动态规划方法求Edit Distance

    Edit Distance,又称编辑距离,定义为将一个字符串转换成另一个字符串所需的最少单字符操作次数,这些操作包括插入一个字符、删除一个字符或替换一个字符。例如,将字符串"Kitten"转换为" Sitting"需要进行以下三次...

    编辑距离JS算法

    编辑距离(Edit Distance),又称Levenshtein距离,是一种衡量两个字符串相似度的方法。它定义为通过插入、删除或替换一个字符的方式将一个字符串转换成另一个字符串所需的最少操作次数。 #### 二、编辑距离的应用...

    基于编辑距离的拼写矫正算法

    编辑距离(Edit Distance)是解决这一问题的一种经典算法,它衡量的是两个字符串之间通过插入、删除、替换操作转化为彼此所需的最少步骤数。本篇将详细介绍编辑距离的概念及其在拼写矫正中的应用。 **一、编辑距离...

    mytac#blogs#119.编辑距离算法(Edit Distance)1

    1.矩阵初始化 2.计算最小值 3.类推完成,取右下角的值,即为最短编辑距离

    DNA.rar_DNA_edit distance

    标题中的“DNA.rar_DNA_edit distance”...总之,这个“DNA.rar_DNA_edit distance”主题涵盖了生物信息学中的DNA序列比对、编辑距离算法的计算,以及可能的GUI编程实践,这些都是IT领域与生物科学交叉的重要知识内容。

    一种编辑距离算法及其在网页搜索中的应用

    编辑距离(Edit Distance)是一种衡量两个字符串相似度的指标,定义为将一个字符串转换成另一个字符串所需的最少单字符编辑操作次数。常见的编辑操作包括插入、删除和替换。传统的编辑距离算法,如Levenshtein距离,...

    算法设计编辑距离问题

    **编辑距离**(Edit Distance),也称为Levenshtein Distance,是一种衡量两个字符串相似度的方法,即通过最少的操作次数(如插入、删除或替换字符)将一个字符串转换成另一个字符串所需的步骤数。在自然语言处理、...

    字符串的相似度 编辑距离 java实现

    编辑距离(Edit Distance)是计算两个字符串之间的相似度的算法,它定义了从原串(s)转换到目标串(t)所需要的最少的插入、删除和替换的数目。在自然语言处理(NLP)中应用非常广泛,如一些评测方法中就用到了...

    Algorithm-EditDistance.zip

    总结来说,“Algorithm-EditDistance.zip”中的内容展示了编辑距离算法在iOS开发中的实际应用,尤其是在优化UITableView和UICollectionView性能方面的价值。通过理解并熟练运用这种算法,开发者能够更好地处理数据流...

    C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码

    莱文斯坦距离,是编辑距离(Edit Distance)的一种。 编辑距离一般是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。 比如...

    Indexing for Subtree Similarity-Search using Edit Distance

    Sara Cohen在其2013年发表于SIGMOD的文章中,探讨了如何使用树编辑距离(Tree Edit Distance)来解决大规模树集合中的子树相似性搜索问题。 首先,文章定义了树编辑距离。在比较树结构时,编辑距离是指将一棵树转换...

Global site tag (gtag.js) - Google Analytics