我一直在寻找一种先进的编辑距离算法,到目前为止我发现的最好的算法是 O(n*m),其中 n 和 m 是两个字符串的长度。该算法之所以达到如此规模,是因为空间而不是时间,因为创建了两个字符串的矩阵,如下所示:
有没有比 O(n*m) 更好的公开可用的 levenshtein 算法? 我并不反对查看高级计算机科学论文和研究,但一直没能找到任何东西。我找到了一家公司,Exorbyte,据称该公司已经构建了一种超先进、超快速的 Levenshtein 算法,但这当然是一个商业秘密。我正在构建一个 iPhone 应用程序,我想使用 Levenshtein 距离计算。 有一个可用的 Objective-C 实现,但由于 iPod 和 iPhone 上的内存有限,如果可能的话,我想找到更好的算法。
如果您能够进行近似,可以使用多对数近似。
对于 O(n +d^2) 算法,请寻找 Ukkonen 的优化或其增强版
Enhanced Ukkonen。据我所知,最好的近似是 Andoni、Krauthgamer、Onak 的这个
Levenshtein Automata 在 O(n) 时间内针对单个基本单词评估多个单词 - 并且自动机的构建也可以在 O(m) 时间内完成。
public static int optimalStringAlignmentDistance(String s1, String s2) {
if (s1.length() > s2.length()) {
return optimalStringAlignmentDistance(s2, s1);
}
// Initialize the table
int[][] dp = new int[s1.length()+1][s2.length()+1];
for (int i = 0; i <= s1.length(); i++) {
dp[i][0] = i;
}
for (int j = 0; j <= s2.length(); j++) {
dp[0][j] = j;
}
// Populate the table using dynamic programming
for (int i = 1; i <= s1.length(); i++) {
for (int j = i; j <= s2.length(); j++) {
if (s1.charAt(i-1) == s2.charAt(j-1)) {
dp[i][j] = dp[i-1][j-1];
} else {
int topMin = Math.min(dp[i-1][j-1], dp[i-1][j]);
if (j == i) {
// dp[i][j-1] is not in this triangular portion
dp[i][j] = 1 + topMin;
} else {
dp[i][j] = 1 + Math.min(topMin, dp[i][j-1]);
}
}
}
}
// Return the edit distance
return dp[s1.length()][s2.length()];
}