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を返します.
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;
    }
    
     
};