我有大量的字符串说N,我必须从中找出相似字符串的集合 例如:
输入:
programmable
stackover
tree
stackoverflow
trie
program
oddoneout
输出:
set 1:
programmable
program
set 2:
stackoverflow
stackover
set 3:
tree
trie
set 4:
oddoneout
那么,什么应该有效algorithm
(空间和时间)?
1)使用levenshtein距离是好方法,但我们仍然需要为每个字符串搜索所有n-1个字符串。
2)使用trie可能是好的(就前缀而言)但不是最好的方法,因为它无法比较像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
请分享您的观点。
请不要发布有关外部软件等的信息。
答案 0 :(得分:0)
你能做一个基于点的系统,其中每个匹配的角色得分1,比方说,和其他类似的发声字母(或键盘上接近它的字母或关闭的语音声音得到0.5或者其他),其他人得到零匹配。
所以,你有tree
,你想要找到类似的词。
program
得分为1,因为只有r匹配在正确的位置。
trie
获得3。
例如,trwe
之类的内容可能会达到3.5。
然后你用宽容来看分数。这种宽容会决定你有多接近它。
但它确实取决于你在寻找什么。
这是一个完全无处不在的东西,所以不确定它的效果如何。只是一个想法。
答案 1 :(得分:0)
您对2个字符串的相似性的约束听起来像编辑距离问题:
http://en.wikipedia.org/wiki/Levenshtein_distance
您可以通过O(NxM)中的动态编程算法获得两个字符串之间的最小编辑距离,其中N和M是每个字符串的长度。
你可以设置一个阈值数字,说“你的字符串有多相似”,设置这个数字后,你可以尝试全部反对所有算法来检查所有字符串之间每个可能的最小编辑距离。我认为你可以使用该信息制作套装
如果您知道问题中的字符串很短(比如长度<100),这种方法可能是一个很好的解决方案。
修改强>
设K是要在集合中进行分类的字符串数,让N为字符串的长度平均值。我提出的算法的复杂性是O((K ^ 2)x(N ^ 2))。
(这就是我们希望N成为一个小数字的原因)