gpt4 book ai didi

c++ - Rabin-Karp 算法代码中的负哈希值

转载 作者:行者123 更新时间:2023-12-04 03:39:12 25 4
gpt4 key购买 nike

我从这个网站理解了 Rabin-Karp 算法:https://www.geeksforgeeks.org/rabin-karp-algorithm-for-pattern-searching/
他们在 C++ 中有以下代码用于算法:

#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;
}
我不明白的是这段代码:
            // We might get negative value of t, converting it  
// to positive
if (t < 0)
t = (t + q);
怎么可以 t曾经是消极的?我们减去 t总是小于 t然后我们添加一些东西,那么 t的可能性在哪里?偏负偶从何而来?
我在没有这个的情况下测试了代码 if声明,它没有正常工作。预期的输出是:
Pattern found at index 0
Pattern found at index 10
但我得到了:
Pattern found at index 0

最佳答案

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

t = 3
t = (t + 5) % 7
t = (t - 5) % 7
那么这些值是
(3 + 5) % 7 == 1
(1 - 5) % 7 == -4
如果我们添加 7,则可以根据需要生成 3。

关于c++ - Rabin-Karp 算法代码中的负哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66346164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com