【问题标题】:Algorithm to check if any of a set of strings matches the input text?检查一组字符串是否与输入文本匹配的算法?
【发布时间】:2015-05-31 13:19:05
【问题描述】:

因此,我们有一组多个字符串,并希望优化算法来检查是否可以在输入文本中找到任何这些字符串。重要的是我们对找到所有匹配的字符串不感兴趣,找到一个就足够了。

我发现了这个:http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm 看起来确实不错,但它找到了所有匹配的模式。如果我们不需要那些额外的信息,有没有办法更快地得到一些东西?

当然,我们可以在 Aho Corasick 算法找到第一个匹配模式时终止它,但是对于这类问题还有另一种更快的方法吗?

【问题讨论】:

  • 字典搜索在 O(N) 左右运行,使内存总线饱和。或者,如果文件在磁盘上:I/O 通道。所以有效,无法改进。

标签: algorithm


【解决方案1】:

你不能把它降低很多,因为复杂度是

算法的复杂度与模式长度加上搜索到的文本长度加上输出匹配的数量成线性关系。

显然,您必须仔细阅读每个模式和文本。

唯一需要减少的是输出匹配的数量。但这真的很简单。在原始算法中,一旦满足接受状态,它就会输出所有匹配它的字典项。对于您的变体,只需将接受状态标记为接受并输出一些“接受”符号”,或者在构建 FSM 时任意选择一个字典项并输出。

【讨论】:

    【解决方案2】:

    只需构建一个正则表达式,让您的编程语言库为您完成艰苦的工作和优化。我最近用 C# 写过:http://rextester.com/WFQNET2876

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      相关资源
      最近更新 更多