C++hash哈希表入门:元素查找

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

[Submit][Status]

哇,这道题好容易啊,直接暴力也!

#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"); //大小写坑人 
    }
}

我们看看这个代码怎么样:
在这里插入图片描述

发布了15 篇原创文章 · 获赞 19 · 访问量 2648

猜你喜欢

转载自blog.csdn.net/android1298/article/details/104374947