String 将robin-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

我正在尝试使用Rabin-karp算法解决字符串匹配问题

我使用了霍纳的方法来计算散列函数,但是我忘记了使用模运算符。现在是这样的

(这是大字符串的起始模式长度)


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    }