我有这个 Rabin Karp 实现。现在我为滚动哈希做的唯一事情就是power*source[i]
从sourceHash
. power
是31^target.size()-1 % mod
但我不明白为什么我们要mod
在sourceHash
它变成负数时添加。我尝试添加其他值,但它不起作用,它仅在我们添加mod
. 为什么是这样?是否有特定原因为什么我们要添加mod
而不是其他任何内容(例如随机大数字)。
int rbk(string source, string target){
int m = target.size();
int n = source.size();
int mod = 128;
int prime = 11;
int power = 1;
int targetHash = 0, sourceHash = 0;
for(int i = 0; i < m - 1; i++){
power =(power*prime) % mod;
}
for(int i = 0; i < target.size(); i++){
sourceHash = (sourceHash*prime + source[i]) % mod;
targetHash = (targetHash*prime + target[i]) % mod;
}
for(int i = 0; i < n-m+1; i++){
if(targetHash == sourceHash){
bool flag = true;
for(int j = 0; j < m; j++){
if(source[i+j] != target[j]){
flag = false;
break;
}
}
if(flag){
return 1;
}
}
if(i < n-m){
sourceHash = (prime*(sourceHash - source[i]*power) + source[i+m]) % mod;
if(sourceHash < 0){
sourceHash += mod;
}
}
}
return -1;
}