在一个巨大的字符串中搜索一个小字符串

时间:2014-12-09 20:27:30

标签: vb.net string

我正在开展一个项目,我必须在一个非常大的字符串中搜索一个小字符串(大约40个字符)(我们说的是大约一亿个字符)。我正在寻找最快捷的方式。我尝试了几种方法:这些是基准测试的结果:

  • Contains 248 ms 中返回True;
  • IndexOf 671 ms 中返回True(我原本不会这么说!);
  • Contains使用数组而不是仅在 48毫秒
  • 中返回True的字符串;

即使数组中的Contains似乎是最好的方法,我也看了一些搜索算法(Knuth–Morris–PrattRabin-KarpBoyer-Moore ),但它们似乎都不适合我的情景

我的问题是:是否有更快的方法在一个非常大的字符串中搜索一个小字符串?

谢谢,

PWhite

1 个答案:

答案 0 :(得分:0)

如果您想要重复搜索非常小的子字符串的固定巨大字符串,则可能需要搜索实现suffix treesuffix array的库。完成预处理工作以构建后缀树或数组后,搜索长度为P的模式的运行时间为后缀树的O(P)和后缀树的O(P + log T),其中T是长文本字符串的长度。这可能比你现在看到的显着快,但你需要更重量级的库才能做到这一点。

另一方面,如果您有一组固定的模式字符串和要搜索的大字符串的旋转强制转换,您可能需要使用Aho-Corasick string matching algorithm,它可以扫描所有出现的固定集合时间为O(T + z)的长度为T的字符串中的模式,其中z是匹配的数量。这通常在实践中非常快。