C++hash哈希表入门:元素查找
首先,我们来看一道题:
Problem : 元素查找
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 87 Solved: 42
[Submit][Status][Web Board]
Description
给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。
Input
第一行两个整数 n 和m。
第二行n个正整数(1<=n<= 100000)
第三行m个整数(1<=m<=100000)
所有数据都不超过10^8
Output
一共m行,若出现则输出YES,否则输出NO
Sample Input
4 2
2 1 3 4
1 9
Sample Output
YES
NO
HINT
哇,这道题好容易啊,直接暴力也!
#include<bits/stdc++.h>
using namespace std;
int a[100001];
int main(){
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1,b;i<=m;i++){
cin>>b;
bool ok=false;
for(int j=1;j<=n;j++)
if(b==a[j]){
puts("YES");
ok=true;
break;
}
if(ok==false)puts("NO");
}
return 0;
}
开开心心交题,结果!
机智的你又想到了一个好方法!
#include<bits/stdc++.h>
using namespace std;
int a[100001];
bool c[100000001];
int main(){
memset(c,false,sizeof(c));
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
c[a[i]]=true;
}
for(int i=1,b;i<=m;i++){
cin>>b;
if(c[b]==true)puts("YES");
else puts("NO");
}
return 0;
}
没错,桶是可以ac的,但是!
怎么看怎么不舒服,再说可能被别人限制内存
那我们该怎么优化呢?
首先看哈希表,这道题用哈希表做不难
什么是哈希表?
哈希表就是把哈希值存在表里(感觉我跟没说似的)
而哈希值,是数字(或字符,字符串)经过mod得到的一个值,这个值最好用unsigned long long存储。而哈希表用一个类似树的方式存储哈希值
代码
#include<cstdio>
const int mod=170001;
int cnt,n,m,ans,h[170001],pre[100001],nxt[100001];
void add(int x) {
int tmp=x%mod;
pre[++cnt]=x;
nxt[cnt]=h[tmp];
h[tmp]=cnt;
}
bool find(int x) {
int tmp=x%mod;
for(int i=h[tmp]; i; i=nxt[i])
if(pre[i]==x)return true;
return false;
}
int main() {
scanf("%d",&n);scanf("%d",&m);
for(int i=1,x; i<=n; i++)
scanf("%d",&x),add(x);
for(int i=1,x; i<=m; i++) {
scanf("%d",&x);
if(find(x)==true)puts("YES");
else puts("NO"); //大小写坑人
}
}
我们看看这个代码怎么样: