String 将robin-karp算法(无模算子)改为Rabin-karp算法(带模多算子)进行字符串匹配
我正在尝试使用Rabin-karp算法解决字符串匹配问题 我使用了霍纳的方法来计算散列函数,但是我忘记了使用模运算符。现在是这样的 (这是大字符串的起始模式长度)String 将robin-karp算法(无模算子)改为Rabin-karp算法(带模多算子)进行字符串匹配,string,performance,optimization,string-matching,rabin-karp,String,Performance,Optimization,String Matching,Rabin Karp,我正在尝试使用Rabin-karp算法解决字符串匹配问题 我使用了霍纳的方法来计算散列函数,但是我忘记了使用模运算符。现在是这样的 (这是大字符串的起始模式长度) 1 for(i=0;这里已经有一个隐式的模运算,unsigned long long不是BigInt类型。如果我使用模运算,它(使用模运算)所用的时间是否比这个(不使用模运算)少?不完全是。但是,您应该修复错误。您不能使用/31实现模除。您应该乘以31的模乘逆,例如32位的*0xbdef7bdf(0xEF7BDF表示64位) 1
1 for(i=0;这里已经有一个隐式的模运算,unsigned long long
不是BigInt类型。如果我使用模运算,它(使用模运算)所用的时间是否比这个(不使用模运算)少?不完全是。但是,您应该修复错误。您不能使用/31
实现模除。您应该乘以31的模乘逆,例如32位的*0xbdef7bdf
(0xEF7BDF
表示64位)
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 }
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 }