【问题标题】:Levenshtein distance. Max distance exception莱文斯坦距离。最大距离异常
【发布时间】:2018-02-28 16:16:12
【问题描述】:

我有这个 levenstein 算法:

public static int? GetLevenshteinDistance(string input, string output, int maxDistance)
        {
            var stringOne = String.Empty;
            var stringTwo = String.Empty;

            if (input.Length >= output.Length)
            {
                stringOne = input;
                stringTwo = output;
            }
            else
            {
                stringOne = output;
                stringTwo = input;
            }

            var stringOneLength = stringOne.Length;
            var stringTwoLength = stringTwo.Length;

            var matrix = new int[stringOneLength + 1, stringTwoLength + 1];

            for (var i = 0; i <= stringOneLength; matrix[i, 0] = i++) { }
            for (var j = 0; j <= stringTwoLength; matrix[0, j] = j++) { }

            for (var i = 1; i <= stringOneLength; i++)
            {
                bool isBreak = true;

                for (var j = 1; j <= stringTwoLength; j++)
                {
                    var cost = (stringTwo[j - 1] == stringOne[i - 1]) ? 0 : 1;

                    matrix[i, j] = Math.Min(
                        Math.Min(matrix[i - 1, j] + 1, matrix[i, j - 1] + 1),
                        matrix[i - 1, j - 1] + cost);

                    if (matrix[i, j] < maxDistance)
                    {
                        isBreak = false;
                    }
                }

                if (isBreak)
                {
                    return null;
                }
            }

            return matrix[stringOneLength, stringTwoLength];
        }

我检查了每个值,如果它 > 我打破的最大距离。 但它并不总是能正常工作。

例如:

string1 = "#rewRPAF"
string2 = "#rewQVRZP"
maxDistance = 4

我得到值 5 但不为空。

这个解决方案我明白了 - Levenstein distance limit

【问题讨论】:

  • 你试图找出问题的原因是什么?
  • @user743414 如果当前距离 > 最大距离,我希望得到 null 值。我不想把算法算到最后。

标签: c# string algorithm levenshtein-distance


【解决方案1】:

我们不在这里修复代码,但我会帮助您自己修复它。

改变这个

            if (matrix[i, j] < maxDistance)
            {
                isBreak = false;
            }

            if (matrix[i, j] < maxDistance)
            {
                isBreak = false;
            } else {
                System.Diagnostics.Debugger.Break();
            }

当您到达maxDistance 时,这应该会破坏调试器,当这种情况发生时,请在调试器中前进并遵循您的程序所做的事情。这应该可以让您看到您不希望发生的事情。

【讨论】:

    【解决方案2】:

    看看第一次围绕内循环发生了什么。此时成本不能超过1。因此,如果 MaxDistance 大于 1,则 IsBreak 始终设置为 false。

    我的直觉说:

    放弃与 IsBreak 相关的所有内容

    int Distance = matrix[stringOneLength, stringTwoLength];
    return Distance > MaxDistance ? null : Distance;
    

    但我没试过。

    或者(我对 Levenshtein 所做的工作还不够充分,无法对这种方法充满信心):

    放弃与 IsBreak 相关的所有内容

    if (matrix[i, j] < maxDistance)
        {
            isBreak = false;
        }
    

    变成

    if (matrix[i, j] > maxDistance)
        {
            return null;
        }
    

    (请注意,您的终止测试是一对一的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多