Algorithm Levenshtein算法-如果编辑距离大于给定阈值,则快速失败

Algorithm Levenshtein算法-如果编辑距离大于给定阈值,则快速失败,algorithm,delphi,levenshtein-distance,Algorithm,Delphi,Levenshtein Distance,对于我找到的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 Re

对于我找到的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;
对于i:=1到n do
对于j:=1到m do
开始
d[i,j]:=Min(Min(d[i-1,j]+1,d[i,j-1]+1),d[i-1,j-1]+整数(s[i]t[j]);
//检查
结果:=d[n,m];
如果结果>最大值,则
开始
出口
结束;
结束;

我想你想要的是找到levenstein距离,如果它低于
MAX
,对吗

如果是这样,达到一个大于
MAX
的值是不够的,因为它只意味着某些路径比该路径长,而不是不存在较短的路径。为确保找不到小于
MAX
的路径,必须监控路径的最小可能长度,直到当前点,即距离表中一列的最小长度

我不擅长Delphi,但我认为代码应该是这样的:

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;
对于i:=1到n do
开始;
最小值:=最大值+1
对于j:=1到m do
开始;
d[i,j]:=Min(Min(d[i-1,j]+1,d[i,j-1]+1),d[i-1,j-1]+整数(s[i]t[j]);
min:=min(min,d[i,j])
结束;
如果最小值>=最大值,则
出口
结束;

那不好。您分配给
d[i,j]
,但随后测试
d[n,m]
。而且,
ord()
Integer()
更正常,但我更喜欢显式使用
IfThen()
。如果n或m小于1,则不会指定结果。我知道,使用Min使得在两个循环结束之前很难进行优化。