许多字符串中的类似字符串

similar strings out of many strings

本文关键字:字符串 许多      更新时间:2023-10-16

我有大量的字符串说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可能很好(就前缀而言),但不是最好的方法,因为它不能比较像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 是一个小数字)