列表之间的Levenshtein-Distance编辑距离是一个经过充分研究的问题。但是如果知道每个列表中没有元素出现超过一次,我在可能的改进上找不到很多东西 。
我们还假设元素是可比较的/可排序的(但是要比较的列表并不是从头开始排序的)。
更正式地说,
我们如何有效地计算两个给定字符串s,t \ in \ Sigma ^ *之间的编辑距离 ,并保证它们没有重复的字母?
是一个非常大的字母。
列表之间的Levenshtein-Distance编辑距离是一个经过充分研究的问题。但是如果知道每个列表中没有元素出现超过一次,我在可能的改进上找不到很多东西 。
我们还假设元素是可比较的/可排序的(但是要比较的列表并不是从头开始排序的)。
更正式地说,
我们如何有效地计算两个给定字符串s,t \ in \ Sigma ^ *之间的编辑距离 ,并保证它们没有重复的字母?
是一个非常大的字母。
Answers:
TL; DR:当两个字符串(甚至只有一个)都具有唯一字符时,可以在线性运算时间内计算出一种限制更严格的编辑距离,在该距离中,我们只能插入和删除单个字符。这样可以在Levenshtein编辑距离上提供有用的上限和下限。
Levenshtein编辑距离允许单字符插入,删除和替换,将每个字符分配为1的成本。如果我们仅限制插入和删除,我们将得到一个类似的距离度量,现在导致替换的成本为2(因为任何替换都可以(通过插入和删除进行模仿)。我不知道这种限制更严格的编辑距离的标准名称,因此我将其称为“插入/删除编辑距离”。它与最长公共子序列(LCS)问题密切相关,在该问题中,我们给了两个分别为长度和字符串,并且想知道两个字符串中出现的最长子序列的长度。 如果两个字符串具有LCSn L n + m - 2 L,那么它们的插入/删除编辑距离为:最简单的方法是对齐字符串,以使LCS中的字符堆叠在一起,而LCS中不存在的字符则与-
间隙相对字符。显然,我们可以通过在第一行中的第一个插入处和第二-
行中的一个删除处将第一个字符串编辑为第二个字符串-
。例如:
-C-IRC-LE
T-RI-CKLE
这里的LCS CIRCLE
和TRICKLE
,ICLE
具有长度为4,并且所述编辑距离确实是。
绕道的原因是,当至少一个序列仅包含不同的字符时,有一种非常有效的方法来计算LCS(因此,插入/删除编辑距离):在这种情况下,LCS问题可以转化为找到最长的递增子序列的问题,可以在时间。假设我们给了两个字符串和,而字符串具有不同的字符。我们可以将的第一个字符重命名为1,将第二个字符重命名为2,依此类推,以跟踪我们为表中的每个字符分配的编号。然后在A B A A B O (n + m log m )A B n m,我们使用此表重命名其字符(即,每次出现的第一个字符A
都会更改为1等)。最后,我们在中寻找最长的递增子序列B
。这对应于A
和之间的LCS B
,从那里我们可以立即计算出插入/删除编辑距离。如果和长度分别为和,则所需的总时间仅为。
插入/删除距离显然为Levenshtein距离提供了一个上限(因为在插入/删除距离下的任何有效编辑操作序列也是Levenshtein编辑操作的有效序列)。将插入/删除编辑距离除以2也会得到一个下界,因为在最坏的情况下,任何Levenshtein编辑操作都可以更改为2个插入/删除编辑操作。
早在1977年,Hunt和Szymanski提出了一种算法,该算法可以看作是最长的递增子序列算法的推广。每当两个字符串之间的匹配字符位置对的数量很少时,此方法将非常有效。如果存在这样的对,则它们的算法将花费时间。(请注意,如果一个字符串中的所有字符都不同,则。)此算法是原始程序的基础,该程序将整个文本行视为单个字符。 后来切换到使用Myers的 -time算法,其中ø (([R + Ñ )登录Ñ )- [R ≤ ñ ø (Ñ d )ddiff
diff
是插入/删除编辑距离,因为当整体差异较小但某些“字符”(文本行)频繁出现(例如,在C程序代码中仅包含一个大括号的行)时,此效果会更好。
亨特,J。Szymanski,T.(1977),“一种计算最长公共子序列的快速算法”,ACM通信,20(5):350-353,doi:10.1145 / 359581.359603