散列(hash)
将元素通过一个函数转换为整数,使得该整数可以尽量唯一地代表这个元素。
这个转换函数称为散列函数H,如果元素在转换前为key,那么转换后就是一个整数H(key)
散列表也叫哈希表,是根据键(key)而直接访问在内存存储位置的数据结构。通过一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,加快了查找速度。映射函数称为散列函数,存放记录的数组称作散列表。
key为整数时
(1)直接定址法(重要)
H(key)=key或者H(key)=a*key+b
直接把key作为下标或者线性变换
问题:给出N个整数,再给出M个整数,问这M个数中的每个数分别是否在N个数中出现过,其中N,M<=105.
空间换时间。设定bool类型数组hashTable[100010],初始化为false(正整数x在N个正整数中未出现);
读入一个x,就令hashTable[x]=true;
这种做法的时间复杂度为O(N+M)
#include<stdio.h>
const int maxn=100010;
bool hashTable[maxn]={
false};
int main(){
int n,m,x;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&x);
hashTable[x]=true;
}//输入N里面的数字
for(int i=0;i<m;i++){
scanf("%d",&x);
if(hashTable[x]==true){
printf("Yes\n");
}else{
printf("No\n");
}
}//输入M里的数字并判断在N里是否出现。
return 0;
}