我已经写了下面的算法来计算Levenshtein距离,它似乎根据我的测试返回了正确的结果。时间复杂度为O(n + m),空间为O(1)。
我仅看到的所有现有算法在创建矩阵时都具有空间复杂度O(n * m)。我的算法有问题吗?
public static int ComputeLevenshteinDistance(string word1, string word2)
{
var index1 = 0;
var index2 = 0;
var numDeletions = 0;
var numInsertions = 0;
var numSubs = 0;
while (index1 < word1.Length || index2 < word2.Length)
{
if (index1 == word1.Length)
{
// Insert word2[index2]
numInsertions++;
index2++;
}
else if (index2 == word2.Length)
{
// Delete word1[index1]
numDeletions++;
index1++;
}
else if (word1[index1] == word2[index2])
{
// No change as word1[index1] == word2[index2]
index1++;
index2++;
}
else if (index1 < word1.Length - 1 && word1[index1 + 1] == word2[index2])
{
// Delete word1[index1]
numDeletions++;
index1++;
}
else if (index2 < word2.Length - 1 && word1[index1] == word2[index2 + 1])
{
// Insert word2[index2]
numInsertions++;
index2++;
}
else
{
// Substitute word1[index1] for word2[index2]
numSubs++;
index1++;
index2++;
}
}
return numDeletions + numInsertions + numSubs;
}
答案 0 :(得分:0)
有评论,但我认为它可能适合作为答案:
如果您想要任何给定输入的真正最短距离,则简短答案是“否”。
您的代码看起来更高效的原因(以及其他实现创建矩阵而不是执行您的操作的原因)是您的逐步实现会忽略许多潜在的解决方案。
@BenVoigt提供的示例对此进行了说明,另一个更清晰的示例是("aaaardvark", "aardvark")
返回8,应该是2:由于与第一个a
相匹配并认为它可以继续前进,它被绊倒了。实际上,更理想的解决方案是考虑前两个字符的插入。