【问题标题】:Search for a little string in a huge one在一个大字符串中搜索一个小字符串
【发布时间】:2015-02-07 21:22:21
【问题描述】:

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

  • Contains248 毫秒 内返回 True
  • IndexOf671 毫秒 内返回 True(我绝不会这么说!);
  • Contains 使用数组而不是字符串,仅在 48 毫秒 内返回 True

尽管数组中的Contains 似乎是最好的方法,但我也看过一些搜索算法(Knuth–Morris–PrattRabin-KarpBoyer-Moore),但它们似乎都没有适合我的场景

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

谢谢,

PWhite

【问题讨论】:

  • 这只是引出了一个问题,你是如何获得非常大的字符串的?...
  • “包含使用数组”的情况如何?
  • Contains just call IndexOf,您的结果似乎很奇怪。你在多线程中运行吗?
  • @the_lotus Contains 使用 IndexOf 比较类型调用 IndexOf,这可能是它更快的原因。
  • 尝试优化这表明您将不止一次这样做。您会在同一个大字符串中搜索多个单词吗?关于这个巨大的字符串是什么,它是如何创建的,或者你为什么要搜索它,你还有什么可以告诉你的,这可以帮助你找到一种搜索方式,而不仅仅是暴力破解?

标签: vb.net string


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多