无法理解字符串之间编辑距离的想法/用处

时间:2013-01-27 17:39:30

标签: java string algorithm data-structures levenshtein-distance

我正在阅读2个字符串之间编辑距离的问题 它可以通过动态编程使用编辑距离公式来解决。我无法理解的是它的用处。 首先,这与知道2个字符串中最长的常见后续序列有何不同? 如果想要选择一个编辑距离最小的字符串,你可以使用字符串中的最大LCS。对吗? 另外,当我们实际编写代码进行替换时,代码将类似于以下内容:

if(a.length == b.length){  
   for(int i = 0;i < a.length;i++){  
          a[i] = b[i];  
   }  
}  
else{   
    a = new char[b.length];  
    for(int i = 0;i < a.length;i++){  
          a[i] = b[i];  
    }    
}  

我的意思是只更换字符。在进行赋值和检查字符是否相同之间是否有任何区别,如果没有,只有在运行时进行赋值?是不是都是恒定时间操作?
我对这个问题误解了什么?

2 个答案:

答案 0 :(得分:3)

如果编辑中不允许替换(或者替换是插入或删除的两倍),

编辑距离和LCS通过一个简单的公式相关:

ed(x,y)= x.length + y.length - 2 * lcs(x,y).length

如果替换是单独的单位成本操作,则ED可以小于该值。这在实践中很重要,因为我们想要一种方法来创建更短的diff文件。不仅渐近地限制到一个常数因子,而且实际上是最小的因子。

编辑较短的差异文件在这里可能不是一个问题,如果我们不允许替换,它们将不会显着缩短。有更多有趣的应用程序,例如拼写检查器中的排名更正建议(这是基于@nhahtdh的评论)。

答案 1 :(得分:0)

编辑距离与LCS完全不同。 编辑距离是将一个String转换为另一个String所需的最少编辑操作数。一个非常流行的例子是具有编辑操作的Levinstein distance

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

所有这些操作都有偏差,成本为 1

可以使用许多其他操作和成本函数。 例如。你也可以允许操作:交换两个相邻的字符。

例如用于比对DNA序列(或蛋白质序列)。

如果STring的长度为n和m,则复杂度为:
时间: O(n * m)
space: O(min(n,m))

复杂的成本函数会变得更糟。