PHP - 这个Levenshtein距离递归算法是如此之慢还是我错了?

时间:2014-10-29 10:43:27

标签: php algorithm levenshtein-distance

我在维基百科上看到了这个Levenshtein公式:

enter image description here

我已经以递归的方式实现了这个算法(我知道这是一种以低效的方式实现它,但是我想看看效率有多低),这里是代码(在PHP中):

function lev($str1, $str2, $i, $j) {

    if (min($i, $j) == 0) {
      return max($i, $j);
    }
    else {
      $m = ($str1[$i-1] == $str2[$j-1]) ? 0 : 1;
      return min(lev($str1, $str2, $i, $j - 1) + 1,
                 lev($str1, $str2, $i - 1, $j) + 1,
                 lev($str1, $str2, $i - 1, $j - 1) + $m);
    }
}

$str1 = "long long text"; 
$str2 ="absolute";

echo lev($str1, $str2, strlen($str1),strlen($str2));

当我测试它时,就像我对这两个字符串所做的那样(即使"长文本"不是那么长)我得到了一个" Max执行时间为30秒" .. 。,但函数似乎适用于Levenshtein距离较低的字符串(例如$ str1 =" word",$ str2 =" corw")

超过30秒来完成这个脚本太多了,所以也许我在实现中键入了错误的东西(但是当我看到实现时我没有看到任何错误,在我看来我写了正确的算法,如果基于Wiki的公式)

这个实现是如此缓慢还是我在代码中的某个地方出错了?

感谢您的关注!

1 个答案:

答案 0 :(得分:2)

您不在代码中使用memoization,因此它具有指数时间复杂度。这就是它如此缓慢的原因。您可以添加memoization,以避免为同一ij多次计算函数的值,以实现O(N * M)时间复杂度。