哈希表
Posted wwhhtt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希表相关的知识,希望对你有一定的参考价值。
哈希表利用了与字符串哈希类似的思想。
优点:快
缺点:占空间
在储存数据时,计算出相应的哈希值,并存在对应的哈希值的下标中。
如果出现重复的哈希值,不要惊慌,不是基数取得不好,而是因为数字的范围过大。
这是我们利用类似于链表的思想,在一个哈希值下存储多个哈希一样的数据。
例子如下:
“^”代表指向为空,第一列的数字为计算出来的哈希值
其中操作过程非常简单,只需要开一个数组a代表哈希值
然后用邻接表的思想来存数据,查询的时候只需要基础操作就可以了(具体看代码)
取哈希值具体有三种,我有时间再写没时间就算了。
应用
输入n,m代表输入n个数,有m次询问,每次询问如果出现过就输出"YES",否则输出"No"
样例输入:
5
1 1 2 2 3
5
1 2 3 4 5
样例输出
YES
YES
YES
NO
NO
下面给出代码,请认真看注释:
#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> using namespace std; inline int min(int a,int b){return a<b?a:b;} inline int max(int a,int b){return a>b?a:b;} inline int rd() { int x=0,f=1; char c=getchar(); for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘; return x*f; } inline void write(int x) { if(x<0) putchar(‘-‘),x=-x; if(x>9) write(x/10); putchar(x%10+‘0‘); } int head[100006],nxt[1000006],dis[100006];//head[x]代表哈希值为x的数据的编号 //nxt和dis都是邻接表里的基础操作 int stk[100006];//为了优化时间存的计算出来过的哈希值 int total=0,top=0;//total邻接表,top是出现过几个不同的哈希值 void init() { total=0; while(top) head[stk[top--]]=0;//初始化,多组数据时要用 } int ha(int x){ return x%19260817;}//计算哈希值 void add_key(int k) { int h=ha(k); for(int i=head[h];i;i=nxt[i]) if(h==dis[i]) return ;//判断一个数如果存过就不用再存了 if(head[h]==0) stk[top++]=h;//如果还没有出现过这个哈希值,就存进栈 total++; nxt[total]=head[h];//邻接表操作 head[h]=total; dis[total]=k; return ; } void check(int k) { int h=ha(k); for(int i=head[h];i;i=nxt[i])//是否存过 { if(k==dis[i]) { printf("YES "); return ; } } printf("NO "); return ; } int main() { int n; int m; n=rd(); init(); for(int i=1;i<=n;i++) { int x=rd(); add_key(x); } m=rd(); for(int i=1;i<=n;i++) { int x=rd(); check(x); } return 0; }
完结撒花??ヽ(°▽°)ノ?
以上是关于哈希表的主要内容,如果未能解决你的问题,请参考以下文章