查找所有子串的编辑距离的算法

时间:2011-11-15 16:49:21

标签: string algorithm levenshtein-distance similarity edit-distance

给出2个字符串st。我需要找到s编辑距离(Levenshtein距离)到t的每个子字符串。实际上,我需要知道i中每个s位置的内容i开始的所有子串的最小编辑距离是多少。

例如:

t = "ab"    
s = "sdabcb"

我需要得到类似的东西:

{2,1,0,2,2}

说明:

1st position:
distance("ab", "sd") = 4 ( 2*subst )
distance("ab", "sda") = 3( 2*delete + insert )
distance("ab", "sdab") = 2 ( 2 * delete)
distance("ab", "sdabc") = 3 ( 3 * delete)
distance("ab", "sdabcb") = 4 ( 4 * delete)
So, minimum is 2

2nd position:
distance("ab", "da") = 2 (delete + insert)
distance("ab", "dab") = 1 (delete)
distance("ab", "dabc") = 2 (2*delete)
....
So, minimum is 1

3th position:
distance("ab", "ab") = 0
...
minimum is 0

等等。

当然,我可以使用强力算法来解决这个任务。但是有更快的算法吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

Wagner-Fischer算法为您提供“免费”所有前缀的答案。

http://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm

Wagner-Fischer矩阵的最后一行包含从st的每个前缀的编辑距离。

作为问题的第一个问题,对于每个i,运行Wagner-Fischer并选择最后一行中的最小元素。

我很想知道是否有其他人知道(或可以找到)更好的方法。

答案 1 :(得分:4)

要查找给定字符串中的子字符串非常简单。 你采用正常的Levenshtein算法并稍微修改它。

<强> FIRST: 而不是用0,1,2,3,4,5填充矩阵的第一行,...... 你用零填充它。 (绿色矩形)

<强> SECOND: 然后运行算法。

<强> THIRD: 您不是返回最后一行的最后一个单元格,而是搜索最后一行中的最小值并返回它。 (红色矩形)

示例: 针:“aba”,haystack:“c abba c” - &gt; result = 1(转换abba - &gt; aba)

enter image description here

我在这里找到了它:http://ginstrom.com/scribbles/2007/12/01/fuzzy-substring-matching-with-levenshtein-distance-in-python/

我测试了它并且有效。

这比你在问题中通过字符串按字符逐步逐字逐句的建议要快得多。您只需创建一次矩阵。