Rabin-Karp算法对于随机字符串匹配问题有良好的实用性。它建立在指纹思想上。
主串长度为n 模式串长度为m
假设
※①我们可以在O(m)时间计算一个P的指纹f(P)
※②如果f(P)不等于f(T[s..s+m-1]) 那么P一定不等于T[s..s+m-1]
※③我们可以在O(1)时间比较指纹
※④我们可以在O(1)的时间从f(T[s..s+m-1])计算f(T[s+1..s+m])
指纹可以看成一个十进制的数字,算法的关键是能否在O(1)的时间从f(T[s..s+m-1])计算f(T[s+1..s+m])
如果指纹很大,可以考虑用hash的方式来把数字控制在一个大素数q之内。
即ft = (ft-T[s]*10^(m-1)mod q)*10+T[s+m])mod q 可以在O(1)内完成
其中10^(m-1)mo