首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rabin-Karp算法代码中的负散列值

Rabin-Karp算法代码中的负散列值
EN

Stack Overflow用户
提问于 2021-02-24 15:06:40
回答 1查看 99关注 0票数 3

我是从这个网站了解拉宾-卡普算法的:https://www.geeksforgeeks.org/rabin-karp-algorithm-for-pattern-searching/

他们在C++中为算法编写了以下代码:

代码语言:javascript
复制
#include <bits/stdc++.h> 
using namespace std; 
  
// d is the number of characters in the input alphabet  
#define d 256  
  
/* pat -> pattern  
    txt -> text  
    q -> A prime number  
*/
void search(char pat[], char txt[], int q)  
{  
    int M = strlen(pat);  
    int N = strlen(txt);  
    int i, j;  
    int p = 0; // hash value for pattern  
    int t = 0; // hash value for txt  
    int h = 1;  
  
    // The value of h would be "pow(d, M-1)%q"  
    for (i = 0; i < M - 1; i++)  
        h = (h * d) % q;  
  
    // Calculate the hash value of pattern and first  
    // window of text  
    for (i = 0; i < M; i++)  
    {  
        p = (d * p + pat[i]) % q;  
        t = (d * t + txt[i]) % q;  
    }  
  
    // Slide the pattern over text one by one  
    for (i = 0; i <= N - M; i++)  
    {  
  
        // Check the hash values of current window of text  
        // and pattern. If the hash values match then only  
        // check for characters on by one  
        if ( p == t )  
        {  
            /* Check for characters one by one */
            for (j = 0; j < M; j++)  
            {  
                if (txt[i+j] != pat[j])  
                    break;  
            }  
  
            // if p == t and pat[0...M-1] = txt[i, i+1, ...i+M-1]  
            if (j == M)  
                cout<<"Pattern found at index "<< i<<endl;  
        }  
  
        // Calculate hash value for next window of text: Remove  
        // leading digit, add trailing digit  
        if ( i < N-M )  
        {  
            t = (d*(t - txt[i]*h) + txt[i+M])%q;  
  
            // We might get negative value of t, converting it  
            // to positive  
            if (t < 0)  
            t = (t + q);  
        }  
    }  
}  
  
/* Driver code */
int main()  
{  
    char txt[] = "GEEKS FOR GEEKS";  
    char pat[] = "GEEK"; 
        
      // A prime number  
    int q = 101;  
      
      // Function Call 
      search(pat, txt, q);  
    return 0;  
}  

我不理解的是这段代码:

代码语言:javascript
复制
            // We might get negative value of t, converting it  
            // to positive  
            if (t < 0)  
            t = (t + q);  

t怎么可能是负的呢?我们从t中减去的东西总是小于t,然后我们再加上一些东西,那么t为负的可能性从何而来?

我在没有这个if语句的情况下测试了代码,它不能正常工作。exepected输出为:

代码语言:javascript
复制
Pattern found at index 0
Pattern found at index 10

但是我得到了:

代码语言:javascript
复制
Pattern found at index 0
EN

回答 1

Stack Overflow用户

发布于 2021-02-24 20:51:18

Aki Suihkonen有它;对于正的模数,结果要么是零,要么与被除数具有相同的符号,而Rabin-Karp假设结果总是非负的。

例如,如果我们这样做

代码语言:javascript
复制
t = 3
t = (t + 5) % 7
t = (t - 5) % 7

则这些值为

代码语言:javascript
复制
(3 + 5) % 7 == 1
(1 - 5) % 7 == -4

如果我们加7,就会得到3。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66346164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档