开放寻址法
开放寻址法的核心在于find函数 而find函数的关键点在于(%N+N)%N;//这里的先膜再加再膜主要针对c++中的负数膜
而至于memset这里其实是设置一个最大值,而又不会导致溢出,(在这里应该是习惯作用因为并没有加减操作)
memset是对字节赋值,menset(h,0x3f,h)就是把h数组每个元素都设置成0x3f3f3f3f;
代码如下
//开放寻址法
#include<cstring>
#include<iostream>
using namespace std;
const int N = 200003,null =0x3f3f3f3f;
int h[N];
int find(int x){
int t = (x%N+N)%N;
while(h[t]!=null&&h[t]!=x){
t++;
if(t==N)t=0;
}return t;
}
int main(){
memset(h,0x3f,sizeof h);
int n ;
scanf("%d",&n);
while(n--){
char op[2];
int x;
scanf("%s%d",op,&x);
if(*op=='I')h[find(x)]=x;
else{
if(h[find(x)]==null)puts("No");
else puts("Yes");
}
}
return 0;
}
拉链法
而拉链法其实和领接表类似,就是哈希之后如果有冲突则采取单链表的方式