多个扩展字符串匹配的算法

数据挖掘 算法 搜索
2021-10-05 13:52:50

我需要为文本中的多个扩展字符串匹配实现一个算法。匹配正则表达式的算法可能太慢了。

扩展意味着存在通配符(任意数量的字符而不是星号),例如:

abc*def //matches abcdef, abcpppppdef etc.

Multiple表示同时搜索多个字符串模式(而不是单独搜索每个模式),例如:

abc*def
abc
whatever
some*string

问题:

可以进行多个扩展字符串匹配的快速算法是什么?

最好针对 SIMD 指令和多核实现进行优化。开源实现(C/C++/Python)也很棒。我对现代 CPU 的单核上的 10 Gbps+ 性能感兴趣。

谢谢

2个回答

我会推荐正则表达式模式匹配。我知道通常的实现很慢,但是您必须研究 Thompson 的非确定性自动机的构造算法。请参阅维基百科的专门文章然而,这里的维基百科未能正确展示这个宝藏。我强烈建议仔细研究这篇博客文章:正则表达式可以简单快速对于实现,您在给定文章中有指针(例如 awk 和 grep 使用此实现)。

你经常改变图案吗?如果没有,那么您可以使用 Aho-Corasick 方法,其想法是,首先,根据您的模式构建一个有限自动机,然后,使用该自动机对文本进行一次遍历以查找匹配项(如果自动机访问“匹配”状态,则存在匹配)。自动机构建的复杂性应该与模式的长度成线性关系(模式数 * 最大模式长度),匹配阶段应该与您搜索的文本大小成线性关系。