我需要尽可能快地在一个非常大的字符串(大约100k)中找到一组子串(每个大约32个字符)。 我需要搜索模糊。
什么是最好的算法?我尝试将整个大字符串扫描成小字符串并检查每一步的 Levenshtein距离,但这需要很多时间。
答案 0 :(得分:2)
看看BLAST算法(http://en.wikipedia.org/wiki/BLAST)。它用于序列搜索(例如DNA搜索)。基本问题与你的问题非常相似。
基本上你要做的就是索引短字符串并找到匹配丰富的区域,并在该区域进行更多计算成本更高的搜索。
答案 1 :(得分:1)
如果我理解你想要什么(你想找到一个大字符串的子序列,它等于给定的一组长度为32的字符串),你的字母表有一个合理的大小(字母,数字和标点符号,对于例如),那么你可以做到以下几点:
查找每个字母的第一个匹配项。
对于字符串中的每个位置,找到此位置后每个字母的下一个匹配项(您可以在O(l * n)
中执行此操作,其中l是字符串的长度,n是字母表的大小通过从每个字母的末尾扫描)
对于字符串集中的每个字符串,找到该字符串的第一个字母,然后从该位置找到字符串中第二个字母的第一个字母等。
这样你花费O(l * n)
时间进行预处理,但是对于你集合中的每个小字符串,你只需要O(m)
工作,其中m是该字符串的长度。