我在维基百科上看到了这个Levenshtein公式:
我已经以递归的方式实现了这个算法(我知道这是一种以低效的方式实现它,但是我想看看效率有多低),这里是代码(在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的公式)
这个实现是如此缓慢还是我在代码中的某个地方出错了?
感谢您的关注!
答案 0 :(得分:2)
您不在代码中使用memoization,因此它具有指数时间复杂度。这就是它如此缓慢的原因。您可以添加memoization,以避免为同一i
和j
多次计算函数的值,以实现O(N * M)
时间复杂度。