字符串匹配String matching

在文本中查找模式的出现位置。单模式与多模式的复用方式不同,还要区分字节、字符或其他符号序列的匹配语义。

怎样选择#

  • n 为文本长度,m 为单个模式长度,z 为报告的匹配数量;假定一次符号比较或状态转移为 O(1)。
  • 两者都做精确序列匹配。大小写折叠、Unicode 规范化和分词等语义需要在接口或预处理层明确。

算法对照#

具体算法问题与前提时间复杂度辅助空间选择与取舍
KMP 字符串匹配单模式精确匹配预处理与扫描共 O(n+m)O(n+m)前缀 / 失败函数实现 O(m)O(m)前缀表复用失配前的信息,文本指针不回退;模式状态简单。
Aho–Corasick一组模式在同一文本中匹配扫描 O(n+z)O(n+z),另计构建与转移存储稀疏自动机约 O(S)O(S);完整转移表 O(SR)O(SR)Trie 与失败链接共享模式前缀;模式集、字母表和输出量影响内存与总成本。

左右滑动查看完整对照。点击算法名称,查看原理、约束和实现。

参考资料#

Boost Algorithm · Knuth–Morris–Pratt

Aho & Corasick · Efficient String Matching

aho-corasick 1.1.3 · Matching semantics and automata

2 个概念