hash算法初步

字符串hash初步是讨论如何用一个整数唯一的表示一个字符串的问题。

首先来看这么一个问题:如何将一个二维整点坐标P(x,y)用一个整数唯一的表示?(其中0≤x,y≤range)

很容易想到的是 整数=x*range+y。

回到字符串hash初步讨论的问题上,想想它的解决方案

我们不妨设字符串S由A~Z这26个大写字母组成,再不妨把A~Z映射为0~25,这样就可以把26个字母对应到二十六进制中。
接着,按照二十六进制转换成十进制的方法,即可将这个S转换成一个十进制的数。由进制转换的结论可以知道,这个十进制的数是唯一的,于是上述问题得到解决,下面是实现:

(小写字母与之类似)

int hashFunc1(char s[],int len)
{
    int id=0;
    for(int i=0;i<len;i++)
    {
        id=id*26+(s[i]-'A');
    }
    return id;
}

int hashFunc2(char s[],int len) { int id=0; for(int i=1;i<len;i++) { if(s[i]>='A'&&s[i]<='Z') id=id*52+(s[i]-'A'); else if(s[i]>='a'&&s[i]<='z') id=id*52+(s[i]-'a')+26;///注意加26,否则输出的值与大写字母相同 } }

若给n个字符串(恰好由三位大写字母组成),再给出m个询问字符串,问该字符串出现过几次

#include <bits/stdc++.h>

using namespace std;

const int maxn=100;
char s[maxn][5],temp[5];
int hashtable[26*26*26+10];

int hashFunc(char s[],int len)
{
    int id=0;
    for(int i=0;i<len;i++)
    {
        id=id*26+(s[i]-'A');
    }
    return id;
}



int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++) {
        scanf("%s",s[i]);
        int id=hashFunc(s[i],3);
        hashtable[id]++;
    }
    for(int i=0;i<m;i++)
    {
        cin>>temp;
        int id=hashFunc(temp,3);
        cout<<hashtable[id]<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Fy1999/p/9355083.html