拉链法:单数组+数组模拟链表(邻接表)
Attention:
int h[N]={-1};//这样初始化数组为全部-1是不成功的,第一个元素初始化为1,后面99个元素初始化为0;
int h[100] = {0};//定义了数组,并将数组元素全部初始化为0
用memeset()
#include<string.h>
memset(h,-1,sizeof(h));
code:
#include<iostream>
#include<string.h>
using namespace std;
const int N=1e5+3;//大于1e5的第一个质数
int h[N];
int e[N],ne[N],idx;
void insert(int x)
{
int k= (x % N + N) % N;//Tips:保证取模后一定是非负数
e[idx]=x;
ne[idx]=h[k];
h[k]=idx;
idx++;
}
bool query(int x)
{
int k= (x % N + N) % N;//Tips:保证取模后一定是非负数
int i=h[k];
while(i!=-1)
{
if(e[i]==x) return true;
i=ne[i];
}
return false;
}
int main()
{
int n,x;
cin>>n;
memset(h,-1,sizeof(h));
while(n--)
{
char op;
cin >> op;
cin >> x;
if(op == 'I')
{
insert(x);
}
else if(op == 'Q')
{
if(query(x))
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
}
return 0;
}
开放寻址法(只需要一个2N~3N数大的一维数组)
#include<iostream>
#include<string.h>
using namespace std;
const int N=2e5+3 ,nll=0x3f3f3f3f;//nll>1e9,h[i]=nll表示该位置i是空闲的
int h[N];
int query(int x)//返回x所在的位置
{
int k= (x % N + N) % N;//Tips:保证取模后一定是非负数
while(h[k]!=nll&&h[k]!=x)
{
k++;
if(k==N) k=0;
}
return k;
//如果x在集合中,循环会在h[k]==x结束,则返回的k是x在哈希表的位置;
//如果x不在集合中,循环会在h[k]==nll结束,则返回的是x应该存储的位置
}
void insert(int x)
{
int k=query(x);
h[k]=x;
}
int main()
{
int n,x;
cin>>n;
memset(h,nll,sizeof(h));
while(n--)
{
char op;
cin >> op;
cin >> x;
if(op == 'I')
{
insert(x);
}
else if(op == 'Q')
{
if(h[query(x)]==x)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
}
return 0;
}