その文字列をキーにマッピングすることにより、特定の文字列に「ID」を与えるハッシュ関数に取り組んでいます。使用する必要があるアルゴリズムを以下に示します。
string が与えられ
NOTE
た場合、各文字に値を割り当てます。次に例を示します。N = 14, O =15, T = 20, E = 5
次に、乗算して追加します。
14 * 32^3 + 15 * 32^2 + 20 * 32^1 + 5 * 32^0
この式を因数分解すると、次のようになります。
((14 * 32 + 15) * 32 + 20) * 32 + 5
しかし、その値は大きくなりすぎる可能性があるため、括弧の各セットの後に mod 除算を次のように使用します。
((14 * 32 + 15)%tableSize *32 + 20)%tableSize * 32 + 5
これを達成するためのアルゴリズムを作成するにはどうすればよいですか? 私はそれをやろうとしましたが、私の実装は非常に非効率的です。私の教授は、それは 7 行より長くすべきではないと言いました。上記のアルゴリズムを効率的に実装する方法について誰か提案できますか?
誰かが気になる場合の私のアルゴリズムは次のとおりです。
int HashDictionary::getKey(string word) const{
int wordLength = word.length();
int* values = new int[wordLength];
for ( int i = 0; i < wordLength; i++ ) {
values[i] = int(word[i]);
}
int productSoFar = 0;
for(int i = 0; i < wordLength;i++){
productSoFar *= 32;
if(i == 0){
productSoFar = values[i] * 32;
productSoFar = productSoFar + values[i+1];
productSoFar %= tableSize;
i++;
}
else{
productSoFar += values[i];
productSoFar %= tableSize;
}
}
delete [] values;
return productSoFar;
}