【问题标题】:Fastest way to match a string to a number of patterns将字符串与多个模式匹配的最快方法
【发布时间】:2017-03-29 23:59:01
【问题描述】:

我有一个字符串列表,这些字符串是带有 AND 和 OR 运算符以及通配符的模式。现在给定一个输入字符串,如果它匹配任何模式,则返回 true,否则返回 false。

说,我有“n”个模式和一个长度为“m”的查询 现在,显而易见的方法是为字符串中的每个模式运行一个循环和 grep。这需要 O(nm) 时间。

现在,我的问题是,是否有可能做得更好?我在想某种表达式评估有限状态机可能吗?是否有类似的名称/参考实现?

谢谢

【问题讨论】:

  • 请注意,现代 CPU 在线性数据结构上的循环速度非常快(尤其是当循环适合片上内存并且可以预测分支时),并且跟随指针和片外内存的速度要慢得多使用权。无论您尝试什么,都应该将其与愚蠢的蛮力算法进行基准测试。
  • 您当然可以创建一个有限状态机来处理来自所有模式的合并搜索。有关将 RegEx 转变为 FSM 的讨论,请参阅 stackoverflow.com/questions/525004/…

标签: algorithm


【解决方案1】:

您正在寻找Boyer–Moore string search algorithm

如果您首先解析您的模式并从中构建Abstract Syntax Trees,然后还将您的查询字符串解析为另一个抽象语法树,然后使用节点搜索(针对根),您也可以获得良好的结果和树比较算法(相当简单)来查看是否在查询字符串中找到了任何模式字符串。理论上,查询字符串的解析可以在 O(n) 中完成,但实际上我怀疑它会带来更好的性能。不过,这可能是一个有趣的练习。

【讨论】:

  • 我认为你误解了 OP(或者我可能有);我认为 OP is 使用“模式”来指代正在搜索的内容。我认为有许多要搜索的字符串,而只有一个要搜索的字符串。 (此外,“模式”似乎比简单的子字符串复杂得多。)
猜你喜欢
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多