在处理文本数据时,经常需要比较两个字符串的相似度。这种相似度通常是指通过添加、删除或替换字符操作将一个字符串转换成另一个字符串所需的最少操作次数。在网络应用中,这种计算尤其有用,比如用户输入了一个拼写错误的单词,希望找到与其相近的匹配项,而不仅仅是精确匹配。
在传统的算法中,使用一个大小为N*M的矩阵来计算两个字符串S1和S2之间的差异,其中N是S1的长度,M是S2的长度。然而,提出的优化版本仅使用两个数组,这使得算法更加高效。
此外,这个版本还引入了一个“限制”参数。例如,在搜索接近匹配项时,不希望“bicycle”与“hurricane”匹配,因为这两个词的差异太大。传统算法会计算这两个词之间的距离,即使它们非常不同,这会花费很多时间。如果事先知道想要搜索小于某个限制的差异,那么可以节省大量时间。
首先,检查S1和S2是否相同。如果它们相同,那么计算它们的差异就是浪费时间。接下来,计算N和M之间的绝对差值。如果这个差值大于限制,可以确定S1和S2之间的差异大于限制,因为至少需要插入abs(N-M)个字符。
然后,传统算法会检查S1和S2的每个字母。但如果知道差异应该小于限制,那么这样做就是浪费时间。相反,将检查S1的每个字母i,只在S2的i-limit和i+limit之间的字母。检查i-limit之前或i+limit之后的字母是没有用的,因为S1的前i个字母与S2的前i+limit+1、i+limit+2...和i+limit-1、i+limit-2...字母之间的差异肯定大于限制。例如,需要进行limit+1次插入操作,将S1的前i个字母转换成S2的前i+limit+1个字母。
同时,还需要在数组的i+limit-1和i+limit+1位置初始化一个很大的值(如果这些位置存在),以防止算法在下一步选择这些值(因为这部分数组是“未触及”的,其值将为0)。
对于S1的每个字母i,算法会检查是否至少有一个计算值小于或等于限制,否则它将返回无穷大(在算法中,是9.999.999)。
已经在两种流行的网络开发语言中实现了这个算法:PHP和JavaScript。
PHP函数是compare($string1, $string2, $limit):
$string1是要比较的第一个字符串。
$string2是要比较的第二个字符串。
$limit是可选的,但强烈建议使用:它是计算距离的限制。
该函数返回两个字符串之间的距离,或者如果距离大于限制,则返回值9.999.999。
示例:
<?php
echo compare(
"efficient",
"sufficient",
4
);
// 输出将是 2
?>
JavaScript函数是compare(string1, string2, limit):
string1是要比较的第一个字符串。
string2是要比较的第二个字符串。
limit是可选的,但强烈建议使用:它是计算距离的限制。
该函数返回两个字符串之间的距离,或者如果距离大于限制,则返回值9.999.999。
<script>
alert(compare(
"efficient",
"sufficient",
4
));
// 输出将是 2
</script>