我正在阅读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];
}
}
我的意思是只更换字符。在进行赋值和检查字符是否相同之间是否有任何区别,如果没有,只有在运行时进行赋值?是不是都是恒定时间操作?
我对这个问题误解了什么?
答案 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))
复杂的成本函数会变得更糟。