假设我们有一个长度为数百万的字符串S.字符串只包含'a''t''g''c',我们有一个长度大约为20的模式W.在C ++中,在S中找到所有W的最快算法是什么?看来KMP还不够快。
答案 0 :(得分:3)
KMP在S + W中是线性的。你不可能比这更快。
您至少需要读取数据,这也是线性的。因此,即使您的算法是即时的,您仍然无法比KMP做得更好。
我怀疑你读取数据或以破坏缓存的方式遍历数据时出错了。
答案 1 :(得分:2)
你可以试试Suffix Tree但是,如果你只处理一次,那么树需要O(n log n)来创建,所以KMP对单次检查来说更快。因此,如果您有多个不同的'W'可以找到,那么我会使用后缀树,否则KMP可能是您最好的选择。
来自维基百科的文章:
字符串的后缀数组可用作快速定位的索引 字符串S中每次出现子串模式P.查找 模式的每次出现都等同于查找每个后缀 以子字符串开头。感谢词典 在排序时,这些后缀将在后缀数组中组合在一起 并且可以通过两次二进制搜索有效地找到。