3

このおそらく繰り返される質問についてお詫び申し上げます。

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文字のパターンに一致していないようです私が間違っている可能性のあるアイデアはありますか?

ありがとう、バーヴィア

4

1 に答える 1

0

この問題にさらに時間を費やしたところ、 long long txtHash の値をデフォルト値に初期化したため、ハッシュが一致しない状況に直面していたことがわかりました。上記のコードを修正して更新する

于 2011-10-20T07:59:34.810 に答える