乘法hash:

这类hash函数利用了乘法的不相关性

 

int Hash(char *str)
{
    int seed = 131 , value=0;
    while(*str != '\0'){
        value = value*seed+(*str++);
    }
    return value&0x7fffffff;
}

这里用的乘数是131 , 还推荐的乘数还有1313 , 13131 , 131313等

 

除了乘以一个固定的数,常见的还有乘以一个不断改变的数,比如:

 int Hash(char *str)
{
    int b = 378551 , a = 63689;

  int hash = 0;
    while(*str != '\0'){
        hash = hash*a+(*str++);

    a*a*b;
    }
    return value&0x7fffffff;
}

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 using namespace std;
 6 char str[105];
 7 int _hash[5000];
 8 
 9 int Hash(char *str)
10 {
11     while(*str == '0') str++; //这道题目的字符串要去除前导0
12     int seed = 131 , value=0;
13     while(*str != '\0'){
14         value = value*seed+(*str++);
15     }
16     return value;
17 }
18 
19 int main()
20 {
21   //  freopen("a.in" , "r" , stdin);
22     int n;
23     while(~scanf("%d" , &n))
24     {
25         memset(_hash , 0 , sizeof(_hash));
26         for(int i=0 ; i<n ; i++)
27         {
28             scanf("%s" , str);
29             int index = Hash(str);
30           //  cout<<"index: "<<i<<" "<<index<<endl;
31             _hash[i]=index;
32         }
33         sort(_hash , _hash+n);
34         int ans = 0;
35         int cnt = 1;
36         for(int i=1 ; i<n ; i++){
37             if(_hash[i] == _hash[i-1]){
38                 cnt++;
39 
40             }
41             else{
42                 ans = max(ans , cnt);
43                 cnt = 1;
44             }
45         }
46         ans = max(ans , cnt);
47         printf("%d\n" , ans);
48     }
49     return 0;
50 }

 

 posted on 2015-04-13 00:59  Love风吟  阅读(206)  评论(0编辑  收藏  举报