代码之家  ›  专栏  ›  技术社区  ›  Jon Willis

C#:高效地搜索大字符串以查找其他字符串

  •  5
  • Jon Willis  · 技术社区  · 17 年前

    我使用C#在大字符串中连续搜索多个字符串“关键字”,它们是>=4kb。这段代码不断循环,睡眠并没有在保持合理速度的同时充分减少CPU的使用。陷入困境的是关键词匹配方法。

    我发现了一些可能性,所有这些都提供了类似的效率。

    1) http://tomasp.net/articles/ahocorasick.aspx

    -提供了比我需要的更多的功能,但效率不够。

    -我需要做一个“智能”版本的这个,因为它提供足够的效率。循环遍历每个关键字并调用IndexOf并不能减少它。

    有人知道我可以使用什么算法或方法来实现我的目标吗?

    5 回复  |  直到 17 年前
        1
  •  3
  •   Jon Skeet    17 年前

    我没试过,但你看过吗 Rabin-Karp ? 显然,它在最坏情况下的复杂度很差,但通常是相当好的。

    如果你能提供更详细的确切情况(例如关键字、分隔符以及你需要的搜索结果),那会有所帮助。

        2
  •  3
  •   Erich Kitzmueller    17 年前

    你总是在寻找相同的关键词吗? 尝试 Boyer-Moore

        3
  •  2
  •   Community Mohan Dere    9 年前

    我为这个问题开发了IndexOf的有效使用方法:

    A better way to replace many strings - obfuscation in C#

        4
  •  2
  •   csharptest.net    16 年前

    事实上我以前必须解决这个问题,这很有趣。我有20k个html页面,每个页面都有一个标题,并且希望其他页面上出现的所有其他标题都链接到具有该标题的页面。听起来很像你想要完成的。

    1. 对我想要链接的页面的每个“标题”重复步骤1中的过程。
    2. 现在,您只需要从步骤2的每个标题链接列表中找到第一个单词,然后从步骤3查找二进制排序列表。当一个单词是复数时,您可能会发现几个点击,甚至是软点击,因此您可能需要测试二进制列表中的几个起始节点。
    3. 一旦您将文档处理成步骤1中描述的表单,实际上很容易通过插入新节点和/或修改空白值进行修改。完成后,您只需遍历整个列表并将其全部转储到流中。

    无论你如何解决它,都要从中获得乐趣:)

        5
  •  0
  •   gary    16 年前

    我刚刚在一个类似的帖子上发布了这篇文章,但它在这里可能更相关。

    我正在做一个类似的搜索,基本上是在大约45k字节的文本中查找长度约为10-50字节的关键字。我在900万条文本中搜索了大约1900个关键词,因此尽可能快地获取这些关键词也是一个类似的优先事项。

    因此,我发现使用.NET4最快的方法是并行正则表达式IsMatch。

    needles.AsParallel ( ).Sum ( l => Regex.IsMatch ( haystack , Regex.Escape ( l ) ) ? 1 : 0 );
    

    如果有人能找到更快的方法,你会感兴趣吗?