对于Levenshtein算法我发现德尔福此实现 。
我需要它尽快的最大距离被击中停止一个版本,并返回迄今为止发现的距离。
我的第一个想法是每次迭代后检查当前的结果:
for i := 1 to n do
for j := 1 to m do
begin
d[i, j] := Min(Min(d[i-1, j]+1, d[i,j-1]+1), d[i-1,j-1]+Integer(s[i] <> t[j]));
// check
Result := d[n, m];
if Result > max then
begin
Exit;
end;
end;
我猜你想要的是找到编辑距离,如果低于MAX
,对不对?
如果是这样,达到了一个值大于MAX
是不够的,因为它仅仅意味着一些路径比较长,但并不表明不存在较短的路径。 以确保没有路径短于MAX
可以发现,一个具有监视路径的最小可能长度,直到当前点,即,在超过最小的距离表中的列。
我不擅长德尔福,但我认为代码应该是这个样子:
for i := 1 to n do
begin;
min := MAX + 1
for j := 1 to m do
begin;
d[i, j] := Min(Min(d[i-1, j]+1, d[i,j-1]+1), d[i-1,j-1]+Integer(s[i] <> t[j]));
min := Min(min, d[i,j])
end;
if min >= MAX then
Exit;
end;
文章来源: Levenshtein algorithm - fail-fast if edit distance is bigger than a given threshold