Levenshtein距离算法正确吗?

时间:2018-11-28 01:55:41

标签: c# algorithm distance levenshtein-distance

我已经写了下面的算法来计算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;
}

1 个答案:

答案 0 :(得分:0)

有评论,但我认为它可能适合作为答案:

如果您想要任何给定输入的真正最短距离,则简短答案是“否”。

您的代码看起来更高效的原因(以及其他实现创建矩阵而不是执行您的操作的原因)是您的逐步实现会忽略许多潜在的解决方案。

@BenVoigt提供的示例对此进行了说明,另一个更清晰的示例是("aaaardvark", "aardvark")返回8,应该是2:由于与第一个a相匹配并认为它可以继续前进,它被绊倒了。实际上,更理想的解决方案是考虑前两个字符的插入。