0

我正在尝试使用 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

请帮我解决这个问题,我尝试在网上搜索但找不到帮助。提前致谢!

4

0 回答 0