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完全不同。 编辑距离是将一个字符串转换为另一个字符串所需的最小编辑操作数。一个非常流行的示例是具有编辑操作的:
- 插入一个字符
- 删除一个字符
- 替换一个字符
时间: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:实际上ababa
是3@Cratylus:我应该读得更好。你清楚地说你在谈论最长的公共子序列。我脑子里有最长的公共子序列。n.m.的回答显示了你所说的两个问题之间的关系。我最初的假设是作业中的时间是常数。这就是y的意思吗你是说替换吗?“编辑距离”取决于成本函数。有很多成本函数用于不同的问题。@MrSmith42:我不知道你说的“成本函数”是什么意思@Cratylus:您可以为删除/插入/更改分配不同的成本。例如,如果您知道人们更可能键入错误字符,而不是键入更少或更多字符,则您可以减少更改成本,增加插入或删除成本。此成本将允许您对单词更正建议进行排序。@Cratylus:每个编辑操作ion有一个成本值。允许的编辑操作可能非常不同,并且成本的定义可能非常不同。例如,对于插入、删除和替换一个字符,levinstein距离的成本为1。