我正在研究一个哈希函数,它通过将该字符串映射到键来给给定字符串一个“ID”。我需要使用的算法如下所述:
给定字符串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;
}
答案 0 :(得分:1)
你不应该需要2个循环;因为第一件事就是将字符转换为整数,你可以根据需要翻译它们,并完全避免使用数组。这应该加快速度并减少你的行数。
答案 1 :(得分:0)
试试这个:
int HashDictionary::getKey(string word) const{
int wordLength = word.length();
int* values = new int[wordLength];
values[0] = int(word[0]);
values[1] = int(word[1]);
int productSoFar = 0;
productSoFar = values[0] * 32;
productSoFar = productSoFar + values[1];
productSoFar %= tableSize;
for(int i = 1; i < wordLength;i++){
productSoFar *= 32;
productSoFar += values[i];
productSoFar %= tableSize;
values[i] = int(word[i]);
}
delete [] values;
return productSoFar;
}