Levenshtein距离算法优于O(n * m)?

时间:2010-10-30 06:17:29

标签: ios algorithm big-o levenshtein-distance

我一直在寻找一种先进的levenshtein距离算法,the best I have found so far是O(n * m),其中n和m是两个弦的长度。算法处于这种规模的原因是因为空间,而不是时间,创建了两个字符串的矩阵,如下这个:

alt text

是否有公开的levenshtein算法优于O(n * m)?我不反对查看高级计算机科学论文&研究,但一直没有找到任何东西。我找到了一家名为Exorbyte的公司,该公司据称已经建立了超级先进且超快的Levenshtein算法,但当然这是商业秘密。我正在构建一个iPhone应用程序,我想使用Levenshtein距离计算。 There is an objective-c implementation available,但由于iPod和iPhone上的内存有限,我想在可能的情况下找到更好的算法。

4 个答案:

答案 0 :(得分:40)

您是否有兴趣减少时间复杂度或空间复杂度?平均时间复杂度可以降低O(n + d ^ 2),其中n是较长字符串的长度,d是编辑距离。如果您只对编辑距离感兴趣而对重建编辑序列不感兴趣,则只需要将矩阵的最后两行保留在内存中,这样就是order(n)。

如果你有能力进行近似,则存在多对数近似。

对于O(n + d ^ 2)算法,查找Ukkonen的优化或其增强Enhanced Ukkonen。我所知道的最佳近似值是Andoni, Krauthgamer, Onak

答案 1 :(得分:10)

如果您只想要阈值函数 - 例如,测试距离是否低于某个阈值 - 您可以通过仅计算阵列中主对角线两侧的n值来减少时间和空间复杂度。您还可以使用Levenshtein Automata在O(n)时间内针对单个基本单词评估多个单词 - 并且自动机的构造也可以在O(m)时间内完成。

答案 2 :(得分:2)

在Wiki中查看 - 他们有一些想法可以改进这种算法以提高空间复杂度:

Wiki-Link: Levenshtein distance

引用:

  

我们可以调整算法以使用更少的空间,O(m)而不是O(mn),因为它只需要在任何时候存储前一行和当前行。

答案 3 :(得分:0)

我发现另一个声称为O(max(m,n))的优化:

http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#C

(第二个C实现)