空间换时间
给定两个序列,长度分别为n,m,查询后m个数是否在前面n个数中出现过
#include<stdio.h>
const int maxn = 100010;
bool hashTable[maxn] = {false};
int main(){
int m,n,x;
scanf("%d%d",&n,&m);
for(int i = 0;i<n;i++){
scanf("%d",&x);
hashTable[x] = true;
}
for(int i = 0;i<m;i++){
scanf("%d",&x);
if(hashTable[x] == true)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
但是数据不是整数,如字符串则难以处理,所以这时候就用上散列,散列浓缩成一句话:将元素通过函数转换成一个整数,是的该整数尽量唯一地代表这个元素,这个函数称为散列函数H
将一个字符串映射为一个整数,a-z或A-Z,对应0-25,25进制数,在转换成十进制数,每个字母唯一对应一个整数,转换的整数最大为26^len - 1。
int hashTable(char S[],int len){
int id = 0;
for(int i = 0;i<len;i++){
id = id * 26 + (S[i] - 'A');
}
return id;
}
int hashTable(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');
else if(S[i] >= 'a' && S[i] <= 'z')
id = id * 52 + (S[i] - 'a') + 26;
}
return id;
}
int hashTable(char S[],int len){
int id = 0;
for(int i = 0;i<len-1;i++){
id = id * 26 + (S[i] - 'A');
}
id = id * 10 + (S[len-1] - '0') ;
具体实例:
给定N个字符串,再给M个查询字符串,问每个查询字符串在N个字符串中出现的次数
#include<stdio.h>
int hashTable1(char S[],int len){
int id = 0;
for(int i = 0;i<len;i++){
id = id * 26 + (S[i] - 'A');
}
return id;
}
int hashTable2(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');
else if(S[i] >= 'a' && S[i] <= 'z')
id = id * 52 + (S[i] - 'a') + 26;
}
return id;
}
int hashTable3(char S[],int len){
int id = 0;
for(int i = 0;i<len-1;i++){
id = id * 26 + (S[i] - 'A');
}
id = id * 10 + (S[len-1] - '0') ;
return id;
}
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;
scanf("%d%d",&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++){
scanf("%s",temp);
int id = hashFunc(temp,3);
printf("%d\n",hashTable[id]);
}
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容