RK算法是Rabin-Karp算法的简称,是经典的字符串匹配算法,在《算法导论》上是有介绍的,有兴趣的同学可以去看看。
RK算法的复杂度可以说是比上不足比下有余,比一般的匹配算法要好,但是又比不上KMP,Sunday等算法。算法表现跟快排比较相似,算法平均复杂度表现较好,但最坏情况时复杂度会相对较高。
RK算法的核心思想类似于hash函数。对于hash函数有了解的同学应该知道,我们通过hash函数可以将一个字符串映射成一个数字(hash值)。当两个字符串的hash值不相同时,说明这两个字符串一定不匹配,而相同时则说明两个字符串是有可能匹配的,那么就需要进一步验证。
首先给两个字符串,假设str长度为n,pattern长度为m:
char str[]={"abcdefgdcbaefg"};
char pattern[]={"gdcbae"};
我们利用下面的公式可以用pattern计算出一个值X:
d=26;
L=P.length;
X=P[L-1]+d*(P[L-2]+d*(P[L-3]+...+(P[1]+d*P[0])));
把pattern带入上面P中,可以求出一个值pattern_x,这个值就是代表pattern的hash值,或者说是映射值。d的取值根据字符串字符的所有可能性值的数