我正在尝试使用 Rabin-karp 算法解决字符串匹配问题。
我使用了horner的方法来计算哈希函数,但是我忘记了使用模运算符..现在就像这样。
(这是用于大字符串的起始模式长度)
1 for(i=0;i<l1;i++)
2 {
3 unsigned long long int k2 = *(s1+i);
4 p1 += k2 * k1;
5 k1 = (k1 * 31);
6 }
其中 s1 是一个包含字符的字符串,等等
s1[0] (k1^0) + s1[1] (k1^1) 等等....
我对我们需要找到的模式做了同样的事情..
0 unsigned long long int j;
1 for(j=0;j<l1;j++)
2 {
3 unsigned long long int k3 = *(str+j);
4 p2 += k3 * k4;
5 k4 = (k4 *31);
6 }
现在我正在处理大字符串中长度 = 模式长度的字符串。代码是..
0 long long int ll1 = strlen(s1),ll2=strlen(str);
1 for(j=1;j<=ll2;j++)
2 {
3 printf("p1 and p2 are %d nd %d\n",p1,p2);
4 if ( p2 == p1)
5 {
6 r1 = 1;
7 break;
8 }
9 long int w1 = *(str+j-1);
10 p2 -= w1;
11 p2 = p2/31;
12 long int lp = *(str+j+l1-1);
13 p2 += ((lp *vp));
14 }
15 if ( r1 == 0)
16 {
17 printf("n\n");
18 }
19 else
20 {
21 printf("y\n");
22 }
23 }
其中 str 是大字符串,s1 是模式字符串。
我测试了多个输入,我得到了所有输入的正确答案,但它花费了很多时间......然后我意识到这是因为当模式字符串太长时需要进行大量计算,如果我们使用模运算符,我们可以最小化这些计算..**我的问题是如何在搜索模式时将模运算符合并到此代码中?**
我的整个代码:http: //ideone.com/81hOiU
请帮我解决这个问题,我尝试在网上搜索但找不到帮助。提前致谢!