模拟散列表
- 核心思想:数组模拟+冲突处理
拉链法
-
#include<iostream>#include <cstring>using namespace std;//找到的大于范围的最小质数const int N=100003;//h[x]表示哈希后的数组 e,ne表示处理冲突的链表int h[N],e[N],ne[N],idx;void insert(int x){int k=(x%N+N) %N; //保证k为正数 并得到新下标e[idx] = x; //存入链表ne[idx] = h[k]; //头插法 改变头节点(h[k])h[k] = idx++; //更新头节点}bool find(int x){int k=(x%N+N) %N;for(int i=h[k];i!=-1;i = ne[i]){ //从head开始if(e[i] == x) return true; //搜到 返回true}return false;}int main(){int n;cin>>n;memset(h, -1, sizeof h);while(n--){int x;string op;cin>>op>>x;if(op=="I") {insert(x);}else{if(find(x)) cout<<"Yes"<<endl;else cout<<"No"<<endl;}}}
开放寻址法
-
#include<iostream>#include <cstring>using namespace std;//只开一个数组 用一个超过范围的数作为空元素标记 N开为二倍const int N=200003 , null = 0x3f3f3f3f;int h[N];int find(int x){int k=(x%N+N) %N;//当 h[k]不为空 且 不等于x时 找下一个位置while( h[k] !=null && h[k] !=x){k++;if(k==N) k=0;}//找到空位置或者相同元素位置 返回return k;}int main(){int n;cin>>n;memset(h, 0x3f, sizeof h); //全部定为空while(n--){int x;string op;cin>>op>>x;if(op=="I") {int k=find(x); //k为x应该放的位置的下标h[k] = x;}else{int k=find(x);if(h[k]!=null) cout<<"Yes"<<endl;else cout<<"No"<<endl;}}}