lintCode(128)-ハッシュ関数
1202 ワード
問題の説明:データ構造では、ハッシュ関数は、1つの文字列(または任意の他のタイプ)をハッシュ・テーブルのサイズよりも小さく、ゼロ以上の整数に変換するために使用されます.良いハッシュ関数は、競合を最小限に抑えることができます.広く使用されているハッシュ関数アルゴリズムは、任意の文字列が33に基づく大きな整数であると仮定する数値33を使用します.たとえば、次のようにします.
hashcode("abcd") = (ascii(a) * 333 + ascii(b) * 332 + ascii(c) *33 + ascii(d)) % HASH_SIZE
= (97* 333 + 98 * 332 + 99 * 33 +100) % HASH_SIZE
= 3595978 % HASH_SIZE
そのうちHASH_SIZEはハッシュテーブルの大きさを表す(1つのハッシュテーブルがインデックス0~HASH_SIZE-1の配列であると仮定できる).
keyとハッシュ・テーブルのサイズとして文字列を与え、この文字列のハッシュ値を返します.
注意事項:この問題に対してhashアルゴリズムを自分で設計する必要はありません.上記のhashアルゴリズムを実現するだけでいいです.
例:key="abcd"およびsize=100の場合、78を返します.
hashcode("abcd") = (ascii(a) * 333 + ascii(b) * 332 + ascii(c) *33 + ascii(d)) % HASH_SIZE
= (97* 333 + 98 * 332 + 99 * 33 +100) % HASH_SIZE
= 3595978 % HASH_SIZE
そのうちHASH_SIZEはハッシュテーブルの大きさを表す(1つのハッシュテーブルがインデックス0~HASH_SIZE-1の配列であると仮定できる).
keyとハッシュ・テーブルのサイズとして文字列を与え、この文字列のハッシュ値を返します.
注意事項:この問題に対してhashアルゴリズムを自分で設計する必要はありません.上記のhashアルゴリズムを実現するだけでいいです.
例:key="abcd"およびsize=100の場合、78を返します.
class Solution {
public:
/**
* @param key: A String you should hash
* @param HASH_SIZE: An integer
* @return an integer
*/
int hashCode(string key,int HASH_SIZE) {
// write your code here
if(key.length()==0) return 0;
long res=(int)key[0];//res*33 int
for(int i=1;i<key.length();i++)
{
res=res*33%HASH_SIZE+(int)(key[i]);// : res=..., +=,
} // %HASH_SIZE,
res%=HASH_SIZE;
return (int)res;
}
};