Skip to content

模型Model

字符串匹配

String matching · Exact pattern matching

在文本中定位模式串全部出现位置的问题。

形式陈述 ​

精确字符串匹配给定两个有限词:文本 T[0..n) 与模式 P[0..m),寻找所有整数位移 0≤s≤n−m,使

T[s..s+m)=P[0..m).

本文约定空模式出现在全部 n+1 个边界;m>n 时没有匹配。以下成本假定字符访问和相等比较为常数操作。对 1≤m≤n,朴素算法逐位移比较,最坏 O((n−m+1)m),其中已包含报告匹配位置的成本。KMP 预处理模式的最长真前缀—后缀信息,使失配后复用已知匹配而不回退文本指针,预处理 O(m)、扫描 O(n)。有限自动机、Z 算法和 Rabin–Karp 也提供不同时间/空间或随机化权衡。

直觉

字符串匹配寻找模式在文本中的所有起始位置。朴素方法在每个位置重新比较,但一次失配并不抹掉此前得到的信息;高效算法会复用“已经知道哪些前后缀相等”,由模式自身的重复结构判断可以安全右移多少,或借助哈希、自动机状态避免重复工作。算法选择取决于单模式或多模式、离线或在线、字母表大小,以及是否允许概率碰撞或近似误差。

文本窗口与模式对齐
例子与边界

模式 ababaca 的前缀函数记录每个前缀可与自身后缀重合的最长长度,KMP 失配时沿这些 border 回退。Rabin–Karp 用滚动哈希筛选候选位置,若不再逐字符验证,会有碰撞概率。精确匹配不同于允许编辑距离的近似匹配,也不同于正则表达式匹配。空模式按本页约定另行报告全部边界。

文本 abababa 中模式 aba 出现在位置 0,2,4,重叠匹配必须保留。朴素算法最坏 O(nm);KMP 用前缀函数达到 O(n+m),Rabin–Karp 用滚动哈希筛选候选。

空模式、Unicode code point 与字节、大小写归一化都会影响“字符”和位置定义。精确匹配不允许插入删除替换;编辑距离网格则比较两个整串的最小改写费用。若只允许插删且差异较少,Myers 最短脚本算法按编辑次数扩展对角前沿。通配符或正则表达式搜索又需要另行定义允许的模式。

若每个模式位置允许一个明确的字符集合,Shift-And 字符类匹配用掩码同时保留所有匹配前缀,支持单符号通配、补类与重叠端点。跨多个字时须传递移位进位并按实际字数计费;把字符类“有交集”直接替换进KMP的字面相等判断,会错误地保留不成立的后缀。

推论与应用

单模式精确匹配中,KMP 算法用前缀函数在失配时复用已知边界,给出确定性线性最坏时间;Rabin–Karp 算法用滚动哈希筛选窗口,必须把碰撞验证和概率假设写入保证;Aho–Corasick 自动机把模式 Trie 与失败边合并:给它只含 P 的模式集合,就实现这里的单模式接口;保留多个模式时则扩展为报告模式编号与出现位置,扫描时间还要计入输出总数。模式数、是否允许随机碰撞和是否报告全部位置决定应采用哪条路线。

词提供离散符号序列,数组提供索引表示。KMP、Rabin–Karp 与 Z 函数面向一次或少量模式扫描;Aho–Corasick 预处理模式集合后在线读取文本。以上复杂度通常按文本、模式和实际报告数计,不包含建立固定文本全文索引的成本。

编辑器的“查找全部”需要明确是否保留重叠位置,生物序列检索还要明确字母表与是否允许突变,日志扫描常同时匹配一组告警词,编译器词法分析则按多个 token 模式决定最长合法前缀。它们共享模式匹配内核,却因重叠、近似、多模式与优先级规则不同而需要不同接口,不能只报一个扫描复杂度便视为同一任务。

固定文本上的大量查询可转向后缀树,以线性级结构换取沿模式字符导航;Burrows–Wheeler 变换重排文本以暴露可压缩上下文,FM-index再叠加 rank 与采样,分别提供 count、locate 和 extract。后两者构成压缩自索引路线,不是把单次 KMP 的 O(n+m) 简单改写成更小空间。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 32 “String Matching”。
  • Dan Gusfield, Algorithms on Strings, Trees, and Sequences, Cambridge University Press, 1997,Chs. 1–2, borders, prefix matching, and linear algorithms。
关系图谱11 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系