Caf*_*eek 4 c# levenshtein-distance threshold
我有以下实现,但我想添加一个阈值,所以如果结果将大于它,只需停止计算并返回.
我该怎么办呢?
编辑:这是我目前的代码,threshold尚未使用...目标是它被使用
public static int DamerauLevenshteinDistance(string string1, string string2, int threshold)
{
// Return trivial case - where they are equal
if (string1.Equals(string2))
return 0;
// Return trivial case - where one is empty
if (String.IsNullOrEmpty(string1) || String.IsNullOrEmpty(string2))
return (string1 ?? "").Length + (string2 ?? "").Length;
// Ensure string2 (inner cycle) is longer
if (string1.Length > string2.Length)
{
var tmp = string1;
string1 = string2;
string2 = tmp;
}
// Return trivial case - where string1 is contained within string2
if (string2.Contains(string1))
return string2.Length - string1.Length;
var length1 = string1.Length;
var length2 = string2.Length;
var d = new int[length1 + 1, length2 + 1];
for (var i = 0; i <= d.GetUpperBound(0); i++)
d[i, 0] = i;
for (var i = 0; i <= d.GetUpperBound(1); i++)
d[0, i] = i;
for (var i = 1; i <= d.GetUpperBound(0); i++)
{
for (var j = 1; j <= d.GetUpperBound(1); j++)
{
var cost = string1[i - 1] == string2[j - 1] ? 0 : 1;
var del = d[i - 1, j] + 1;
var ins = d[i, j - 1] + 1;
var sub = d[i - 1, j - 1] + cost;
d[i, j] = Math.Min(del, Math.Min(ins, sub));
if (i > 1 && j > 1 && string1[i - 1] == string2[j - 2] && string1[i - 2] == string2[j - 1])
d[i, j] = Math.Min(d[i, j], d[i - 2, j - 2] + cost);
}
}
return d[d.GetUpperBound(0), d.GetUpperBound(1)];
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这是关于你的答案:Damerau - Levenshtein距离,增加一个门槛 (抱歉无法评论,因为我还没有50个代表)
我想你在这里犯了一个错误.你初始化了:
var minDistance = threshold;
Run Code Online (Sandbox Code Playgroud)
你的更新规则是:
if (d[i, j] < minDistance)
minDistance = d[i, j];
Run Code Online (Sandbox Code Playgroud)
此外,您提前退出的标准是:
if (minDistance > threshold)
return int.MaxValue;
Run Code Online (Sandbox Code Playgroud)
现在,观察上面的if条件永远不会成立!你应该初始化minDistance为int.MaxValue