Skip to content

算法Algorithm

Rabin–Karp 算法

施工中 · 内容逐步修订

Rabin–Karp algorithm

用滚动指纹筛选候选位置并核验相等性的字符串匹配算法。

形式陈述 ​

给定长度 n 的文本 T 与长度 m≥1 的模式 P,Rabin–Karp 用可滚动的数字指纹解决字符串匹配。先固定单射的字符整数编码、整数基数 B 和正整数模数 p,按模同余计算长度 m 字符串的指纹

H(s0⋯sm−1)=∑j=0m−1sjBm−1−j(modp).

先计算模式和首个窗口的指纹,并预计算 R=Bm−1modp。若 hi 是从位置 i 开始的窗口指纹,则

hi+1=((hi−TiR)B+Ti+m)modp.

每次指纹不同就跳过;相同就逐字符比较,确认后返回首个匹配位置,或按任务要求继续报告全部位置。若 n<m,直接报告无匹配。空模式按本页所实现的全部匹配接口,单独报告 0,1,…,n 这全部 n+1 个边界,耗时 O(n+1),不进入 Bm−1 的预处理循环;另行选择只找首个匹配的变体时,空模式直接返回位置 0。

带字符核验的版本总是正确。若参数由随机算法选择,它属于 Las Vegas 思路;若省略核验,则指纹碰撞会产生假阳性,属于 Monte Carlo 思路。固定参数且始终核验的版本也可执行,只是不能凭空声称有随机概率保证。

直觉

把窗口想成一个 B 进制数:向右移动时,先减去离开字符的最高位贡献,再整体左移一位,最后补入新字符。模数让这个数保持在有限范围内,也让不同字符串可能落到同一个余数。因此指纹提供的是廉价排除条件,相等本身不证明字符串相等。

滚动指纹、候选与字符核验

图中先做滚动筛选,再走字符核验分支;只有后一步才能把候选变成确定匹配。

例子与边界

用数字字符自身编码,取 B=10,p=13,在文本 1234 中搜索模式 23。首窗 12 的指纹为 12,模式指纹为 23mod13=10,二者不同。窗口右移得到

h1=((12−1⋅10)⋅10+3)mod13=10,

核验两个字符后确认位置 1 匹配;再滚动得到 h2=((10−2⋅10)⋅10+4)mod13=8,对应 34。这里必须把负余数规范到 0,…,p−1。此外,10 与 23 都模13余10,是不同窗口仍会碰撞的具体例子。

文本 abracadabra 中搜索 abra 时,首窗和位置7的窗口都是真匹配。若任务只找首个位置,首窗确认后即可停止;若报告全部位置,就要继续扫描。这一区别会影响时间分析:在全由 a 组成的长文本中搜同样全由 a 组成的模式,每个窗口都真匹配,逐次完整核验会耗费 Θ((n−m+1)m),随机哈希消除不了这项成本。

参数随机性也有明确前提。例如取素数 p,要求字符编码在 Fp 中也互异(可将至多 p 种字符编码为 0,…,p−1),固定一对不同的等长字符串后,再从非零域元素中均匀选择 B;两指纹之差是次数至多 m−1 的非零多项式,在域中至多有 m−1 个根,碰撞概率至多 min(1,(m−1)/(p−1))。仅让整数编码互异还不够:若两个字符编码模 p 相同,长度一的不同字符串就会对所有基数碰撞。此处假定输入不依赖随机种子;固定弱参数不能用这条结论对抗刻意构造的碰撞。

推论与应用

在字长 RAM 中,若模乘可在常数成本内完成,预处理和滚动扫描耗时 O(n+m)。记触发核验的窗口数为 k,确定性上界是 O(n+m+km)。寻找首个匹配时至多完整核验一次真匹配;只有在随机参数保证假命中核验的期望总成本为 O(n+m) 时,才能得到通常所说的期望线性时间。最坏情形仍可达到 O(nm);任意精度整数则另有位运算成本。

字符串匹配是任务,模同余支撑滚动更新,随机化提供碰撞概率分析。通用哈希给出“对任意固定不同键,随机选函数后碰撞概率小”的族性质;滚动多项式指纹还要求窗口能在 O(1) 时间删首添尾,不能把任意通用族直接换进公式。Rabin–Karp 因而适合同长多模式、二维窗口、重复块筛选和文档片段指纹;最后一种仍需把“快速发现候选相似块”与“抗篡改的密码学摘要”分开。

它仍是顺序扫描一次文本的候选过滤器。若文本固定、模式查询很多,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 指纹匹配与伪命中分析。
关系图谱8 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

使用的工具

实现的抽象