浅谈hash
2022/7/11 23:21:08
本文主要是介绍浅谈hash,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
作者很蒻,在这里总结一下自己学一小点hash的经验。
hash可以用于查找,速度很快,可以近似看作为O(1)的时间复杂度,缺点是占用空间比较大,不过在竞赛中这种空间换时间的方式还是值得的。
哈希冲突是说不同的元素的关键字有可能相同,不能保证一个关键字与元素是一一对应的,这样就产生了哈希冲突。
如果想解决哈希冲突,将每一组元素存到对应的关键字的一个链表里去,如果我们找到了这个元素所在的链表,就要花费线性时间复杂度来查找。
解决哈希冲突还有一种方法,那就是顺序寻址法。顺序寻址法就是如果当前关键字已经有了之前的元素,那么以此向后找,直到找到空的关键字,将该元素存至此关键字。
而哈希,一般用求模运算来确定关键字,mod一般被我们设定成一个很大的素数,只要空间足够,素数的大小越大越好。这样可以有效避免哈希冲突,避免花费线性复杂度来查找元素。
附上hash模板!
1 #include<iostream> 2 #include<cstdio> 3 #define N 50000 4 #define B 999979 5 using namespace std; 6 int tot,adj[B],nxt[N],num[N]; 7 int top,stk[N]; 8 void init(){ 9 tot=0; 10 while(top) adj[stk[top--]]=0; 11 } 12 void insert(int k){ 13 int h=k%B; 14 for(int e=adj[h];e;e=nxt[e]) 15 if(num[e]==k) return; 16 if(!adj[h]) stk[++top]=h; 17 nxt[++tot]=adj[h],adj[h]=tot; 18 num[tot]=k; 19 } 20 bool query(int k){ 21 int h=k%B; 22 for(int e=adj[h];e;e=nxt[e]) 23 if(num[e]==k) return 1; 24 return 0; 25 } 26 int a[10000]; 27 int main(){ 28 init(); 29 int n,m; 30 cin>>n; 31 for(int i=1;i<=n;i++){ 32 cin>>a[i]; 33 insert(a[i]); 34 } 35 cin>>m; 36 int num; 37 for(int i=1;i<=m;i++){ 38 cin>>num; 39 if(query(num)) cout<<"Yes\n"; 40 else cout<<"No\n"; 41 } 42 return 0; 43 }
又结束了awa
这篇关于浅谈hash的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南
- 2024-11-23JAVA项目部署入门:新手必读指南
- 2024-11-23Java项目部署入门:新手必看指南
- 2024-11-23Java项目部署入门:新手必读指南
- 2024-11-23Java项目开发入门:新手必读指南
- 2024-11-23JAVA项目开发入门:从零开始的实用教程
- 2024-11-23Java项目开发入门:新手必读指南