许多字符串中的类似字符串
similar strings out of many strings
我有大量的字符串说N,我必须从中找出相似字符串的集合。
例:
输入:programmable
输出:
stackover
tree
stackoverflow
trie
program
oddoneout
set 1:
programmable
program
set 2:
stackoverflow
stackover
set 3:
tree
trie
set 4:
oddoneout
那么,什么应该是有效的algorithm
(在空间和时间上)?
)使用Levenshtein距离是很好的方法,但我们仍然必须为每个字符串搜索所有n-1个字符串。
2)使用trie可能很好(就前缀而言),但不是最好的方法,因为它不能比较像al g
orithm和al q
kefgjwfjfwfkvfvjs这样的字符串,它们根本不相似。
similarity of 2 strings:
请分享您的看法。
1) the less the number of different characters in both , more similar are they
2)one string can be converted/transformed into another by just changing , adding some characters in one or both strings
请不要发布有关外部软件等的内容。
你能做一个基于点的系统,每个匹配的字符得分为1,比如说,和其他类似的发音字母(或键盘上接近它的字母或接近的语音得到0.5或其他东西),而其他人得到零不匹配。
所以,你有tree
,你想找到类似的词。
program
得 1 分,因为只有 r 在正确的位置匹配。
trie
得到 3。
例如,也许像trwe
这样的东西会得到 3.5。
但是,您以宽容的态度看待分数。这种宽容将决定你希望它有多接近。
但这确实取决于您正在寻找什么。
这完全是空中的东西,所以不确定它会有多好。只是一个想法。
你对 2 个字符串相似性的约束听起来像编辑距离问题:
http://en.wikipedia.org/wiki/Levenshtein_distance
您可以通过 O(NxM) 中的动态规划算法获取两个字符串之间的最小编辑距离,其中 N 和 M 是每个字符串的长度。
您可以设置一个阈值数字,说明"您的字符串必须有多相似",设置此数字后,您可以尝试 all against all 算法,以检查所有字符串之间每个可能的最小编辑距离。我认为你可以用这些信息制作集合
如果您知道问题中的字符串会很短(例如长度<100),则此方法可能是一个很好的解决方案。
编辑:
设 K 是你想要在集合中分类的字符串数,让 N 是字符串的长度平均数。我提出的算法的复杂性是O((K^2)x(N^2))。
(这就是为什么我们希望 N 是一个小数字)