Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法理解编辑字符串之间距离的想法/用途_Java_String_Algorithm_Data Structures_Levenshtein Distance - Fatal编程技术网

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

Java 无法理解编辑字符串之间距离的想法/用途,java,string,algorithm,data-structures,levenshtein-distance,Java,String,Algorithm,Data Structures,Levenshtein Distance,我正在阅读有关编辑两个字符串之间距离的问题。 它可以通过使用编辑距离公式的动态规划来解决。我不能理解的是它的用处。 首先,这与知道两个字符串的最长公共子序列有什么不同? 如果要选择编辑距离最小的字符串,则最好使用字符串中的最大LCS。对吗? 此外,当我们实际编写代码进行替换时,代码将类似于以下内容: if(a.length == b.length){ for(int i = 0;i < a.length;i++){ a[i] = b[i]; }

我正在阅读有关编辑两个字符串之间距离的问题。
它可以通过使用编辑距离公式的动态规划来解决。我不能理解的是它的用处。 首先,这与知道两个字符串的最长公共子序列有什么不同?
如果要选择编辑距离最小的字符串,则最好使用字符串中的最大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];  
    }    
}  
如果(a.length==b.length){
对于(inti=0;i
我的意思是,只需替换字符。执行赋值和检查字符是否相同有什么区别吗?如果不相同,则只在运行时执行赋值?这两种操作不是都是固定时间的吗?

我对这个问题有什么误解?

编辑距离与LCS完全不同。 编辑距离是将一个字符串转换为另一个字符串所需的最小编辑操作数。一个非常流行的示例是具有编辑操作的:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符
所有这些操作都是有偏差的,成本为1

也就是说,还有很多其他操作和成本函数是可能的。 例如,您还可以允许以下操作:交换两个相邻字符

例如,它用于对齐DNA序列(或蛋白质序列)

如果字符串长度为n和m,则复杂性为:
时间:O(n*m)
空格:O(最小(n,m))


对于复杂的成本函数可能会变得更糟。

如果编辑中不允许替换(或者替换的成本是插入或删除的两倍),则编辑距离和LCS通过简单公式关联:

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

如果替代是单独的单位成本操作,则ED可以小于该值。这在实践中很重要,因为我们需要一种创建较短的diff文件的方法。不仅仅是渐近有界到常数因子,实际上是最小的可能因子


编辑此处可能不需要考虑较短的diff文件,如果我们不允许替换,它们将不会大幅缩短。还有更有趣的应用程序,比如拼写检查器中的排名修正建议(这是基于下面@nhahtdh的评论).

如果您有两个字符串,例如
network
rooter
,则LCS为2。这意味着如果您想从
rooter
转到
network
,则2个字符将不被修改,而其余的
size(rooter)-2+(abs(size(network)-size(rooter))
将更改。因此编辑距离最小的字符串是编辑距离最大的字符串LCS@Cratylus:可能我是盲ATM,但是
网络
rooter
的哪个LCS长度为2?
tr
网络
rooter
的LCS。LCS不需要contiguous@MrSmith42:实际上AAAA
ababa
是3@Cratylus:我应该读得更好。你清楚地说你在谈论最长的公共子序列。我脑子里有最长的公共子序列。n.m.的回答显示了你所说的两个问题之间的关系。我最初的假设是作业中的时间是常数。这就是y的意思吗你是说替换吗?“编辑距离”取决于成本函数。有很多成本函数用于不同的问题。@MrSmith42:我不知道你说的“成本函数”是什么意思@Cratylus:您可以为删除/插入/更改分配不同的成本。例如,如果您知道人们更可能键入错误字符,而不是键入更少或更多字符,则您可以减少更改成本,增加插入或删除成本。此成本将允许您对单词更正建议进行排序。@Cratylus:每个编辑操作ion有一个成本值。允许的编辑操作可能非常不同,并且成本的定义可能非常不同。例如,对于插入、删除和替换一个字符,levinstein距离的成本为1。