“单模式精确匹配中,KMP 算法用前缀函数在失配时复用已知边界,给出确定性线性最坏时间;Rabin–Karp 算法用滚动哈希筛选窗口,必须把碰撞验证和概率假设写入保证;Aho–Corasick…”
形式陈述
给定长度
先计算模式和首个窗口的指纹,并预计算
每次指纹不同就跳过;相同就逐字符比较,确认后返回首个匹配位置,或按任务要求继续报告全部位置。若
带字符核验的版本总是正确。若参数由随机算法选择,它属于 Las Vegas 思路;若省略核验,则指纹碰撞会产生假阳性,属于 Monte Carlo 思路。固定参数且始终核验的版本也可执行,只是不能凭空声称有随机概率保证。
直觉
把窗口想成一个
图中先做滚动筛选,再走字符核验分支;只有后一步才能把候选变成确定匹配。
例子与边界
用数字字符自身编码,取
核验两个字符后确认位置
文本 abracadabra 中搜索 abra 时,首窗和位置7的窗口都是真匹配。若任务只找首个位置,首窗确认后即可停止;若报告全部位置,就要继续扫描。这一区别会影响时间分析:在全由 a 组成的长文本中搜同样全由 a 组成的模式,每个窗口都真匹配,逐次完整核验会耗费
参数随机性也有明确前提。例如取素数
推论与应用
在字长 RAM 中,若模乘可在常数成本内完成,预处理和滚动扫描耗时
字符串匹配是任务,模同余支撑滚动更新,随机化提供碰撞概率分析。通用哈希给出“对任意固定不同键,随机选函数后碰撞概率小”的族性质;滚动多项式指纹还要求窗口能在
它仍是顺序扫描一次文本的候选过滤器。若文本固定、模式查询很多,FM-index会预处理 BWT 与 rank 结构,以压缩空间回答 count,并为定位另付采样成本。双模数只能降低工程碰撞概率,不等于这种静态全文索引,也不能替代对随机参数和核验策略的正式说明。
参考资料
- Robert Sedgewick、Kevin Wayne,Algorithms,第4版,2011,§5.3 的 RabinKarp.java:首个匹配接口、滚动更新及 Las Vegas 字符核验。
- Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest、Clifford Stein,Introduction to Algorithms,第3版,MIT Press,2009,§32.2:Rabin–Karp 指纹匹配与伪命中分析。