字符串hash初步探讨
问题:学习了整数散列,知道了如何使用hash函数,将一个较大的整数映射为尽可能唯一的较小的整数。这在时间复杂度上有了很大的改进,但如果H(key)里面的key是一个字符换该怎么办呢?
这时就要使用字符串hash,字符串hash是指将一个字符串S映射为一个整数,使得该字符串尽可能唯一的代表该字符串。
#include<bits/stdc++.h>
using namespace std;
int Schar(char s[],int len) {
int id=0;
for(int i=0;i<len;i++)
id=id*26+s[i]-'A';
return id;
}A
int main()
{
char s[3];
cin>>s;
cout<<Schar(s,3)<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int BSchar(char s[],int len) {
int id=0;
for(int i=0;i<len;i++) {
if(s[i]>='A'&&s[i]<='Z')
id=id*52+s[i]-'A';
if(s[i]>='a'&&s[i]<='z')
id=id*52+s[i]-'a'+26;
}
return id;
}
int main()
{
char s[5];
cin>>s;
cout<<BSchar(s,5)<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int Bchar_number(char s[],int len) {
int id=0;
for(int i=0;i<len-1;i++)
if(s[i]>='A'&&s[i]<='Z')
id=id*26+s[i]-'A';
id=id*10+(s[len-1]-'0');
return id;
}
int main()
{
char s[4];
cin>>s;
cout<<Bchar_number(s,4)<<endl;
return 0;
}
最后以一个问题结尾:给出N个字符串(由恰好三位大写字母组成),再给出M个查询字符串,问每个查询字符串在N个字符串出现的次数。
这个题如果不用字符串hash来做,初学算法的我还真想不出什么办法,如果用比较常规的方法来做,那代码量肯定会很大,在这个问题上,体现了字符串hash的优势!
#include<bits/stdc++.h>
#define Max 100
using namespace std;
char S[Max][3],temp[3];
int hashTable[26*26*26+10]={0};
int Hash(char s[],int len) {
int id=0;
for(int i=0;i<len;i++)
if(s[i]>='A'&&s[i]<='Z')
id=id*26+s[i]-'A';
return id;
}
int main()
{
int N,M;
cin>>N>>M;
for(int i=0;i<N;i++) {
cin>>S[i];
hashTable[Hash(S[i],3)]++;
}
for(int i=0;i<M;i++) {
cin>>temp;
cout<<hashTable[Hash(temp,3)]<<"\t";
}
return 0;
}