Rabin-Karp算法
介绍
Rabin-Karp字符串匹配算法与朴素字符串匹配算法类似,都要比较每一个字符串,不同的是Rabin-Karp算法对字符串做预处理,将字符转换为进制数并取模。预处理时间O(m), 匹配时间是O((n - m + 1) m),m是匹配字符串长度,n是目标字符串长度。
RaBin-Karp算法:
- 假设待匹配字符串的长度为M,目标字符串的长度为N(N>=M);
- 首先计算待匹配字符串的hash值,计算目标字符串前M个字符的hash值;
- 比较前面计算的两个hash值,比较次数N-M+1:
1.若hash值不相等,则继续计算目标字符串的下一个长度为M的字符子串的hash值
2.若hash值相同,则需要使用朴素算法再次判断是否为相同的字串;
伪代码:
RABIN_KARP_MATCHER(T, P, d, q) // 输入 文本T,模式P,使用进制d,素数q
n = T.length
m = P.length
h = d^(m - 1) mod q
p = 0
t = 0
for i = 1 to m // preprocessing
p = (d * p + P[i]) mod q
t = (d * t + T[