对这个可能重复的问题道歉。
我正在尝试使用Karp Rabin的滚动哈希。我看了一下滚动哈希的不同实现,我想知道我哪里出错了。尽管文本具有模式,但使用哈希的匹配似乎根本不会发生。 附加(部分)用于计算散列和搜索的代码。
long hash(char* key, int len) {
int j = 0;
unsigned long long h = 0;
for (j = 0; j < len; j++) {
h = h * PRIME_BASE + key[j];
h %= PRIME_MOD;
}
return h;
}
int search(char* pattern, char *txt, int textLength, int patternLength) {
int i, val = 0;
long long txtHash=0;
long power = 1;
for (i = 0; i < patternLength; i++)
power = (power * PRIME_BASE) % PRIME_MOD;
i=0;
printf(" the value of power is %ld ",power);
for (i = 0; i < textLength; i++) {
txtHash = txtHash * PRIME_BASE + txt[i];
txtHash %= PRIME_MOD;
if (i >= patternLength)
{
txtHash -= power * txt[i - patternLength] % PRIME_MOD;
if (txtHash < 0){
//negative can be made positive with mod
txtHash += PRIME_MOD;
}
}
int offset=0;
if(i>=patternLength){
offset=i-patternLength+1;
}
else{
offset=0;
}
if (patHash == txtHash) {
if (check(pattern, txt, offset, patternLength)) {
val++;
}
}
}
if (val > 0) {
return val;
}
// no match
return 0;
}
bool check(char* pattern, char* txt, int k, int M) {
int j = 0;
for (j = 0; j < M; j++) {
if (pattern[j] != txt[k + j]) {
return false;
}
}
return true;
}
我遇到了缓冲区溢出的问题,我已经处理过,但模式和文本哈希似乎不匹配蛋白质序列文本字符串(1000个字符)和17个字符模式 我可能会出错的任何想法?
谢谢, 巴维亚
答案 0 :(得分:0)
我花了一些时间来解决这个问题并发现因为我已经将long long txtHash的值初始化为某个默认值,所以我遇到了散列不匹配的情况。使用修复
更新上面的代码