1.RK算法的由来
RK算法全称Rabin-Karp,是由该算法的2位发明者Rabin和Karp的名字组合而成。
2.RK算法的核心思想
该算法的核心思想就是通过比较2个字符串的hashcode来判断是否包含对方。
3.RK算法的时间复杂度
平均情况为O(n),极端情况下为O(n*m)
4.思路讲解
* a b c d .... x y z
0 1 2 3 4 .... 24 25 26
1.我现在创建了一个27进制的数,*为0,a为1,b为2,让*为0目的是不会出现两个不同字符串值相同,如果你想搜索更多创建更大的进制即可例如将空格' '设置为27 ,这样就是28进制的数,都一样在将其转化为十进制数字 abc该字符串转为的值为 :1*27*27+2*27+3*1 ,这个大家应该都懂
2.rk算法巧妙就巧妙在不需要重新再去计算值,例如 子串:abc 搜索串:aabc
字串的值不等于搜索串的值
我们接下来只需这样
((1*27*27+1*27+2*1)原本的值 -1*27*27)*27 + 3=重新要比较的值
这我相信只要有基础的同学一定可以看懂
有了这些基础后,我们就可以实现我们的代码了
5.代码实现
1.准备工作
int ctonum(char c)//计算单个字符的值,例如字符为a, a-a+1=1,不就是我们要的值吗
{
return c-'a'+1;
}
int strtonum(char* str,int n)//这个函数