哈希表
将比较庞大的值域映射到比较小的数
-
x mod 105
-
冲突 可能把若干个不一样的数映射到同一个数
-
开放寻址法
开一个数组,长度一般为题目要求的两到三倍(经验值
上厕所,去没人的坑位
- x在哈希表中,返回x的下标
- x不在表中,返回应该插入的位置
-
拉链法
开一维数组存储所有的哈希值,两个数字冲突存到一个链上
哈希操作
- 添加
- 查找
- 删除 开一个bool数组,打一个标记
拉链法
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
int h[N], e[N], ne[N], idx;
int n;
void insert(int x)
{
int k = (x % N + N) % N;
e[idx] = x;
ne[idx] = 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])
if(e[i] == x)
return true;
return false;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n;
while(n --)
{
string op;
int x;
cin >> op >> x;
if(op == "I")
{
insert(x);
}
else
{
cout << (find(x) ? "Yes" : "No") << endl;
}
}
return 0;
}
开放寻址法
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 7, null = 0x3f3f3f3f;
int h[N];
int n;
//开放寻址法 上厕所,去没人的坑位
//1. x在哈希表中,返回x的下标
//2. x不在表中,返回应该插入的位置
int find(int x)
{
int k = (x % N + N) % N;
while(h[k] != null && h[k] != x)
{
k ++;
if(k == N) k = 0;
}
return k;
}
int main()
{
memset(h, 0x3f, sizeof h);
cin >> n;
while(n --)
{
string op;
int x;
cin >> op >> x;
int k = find(x);
if(op == "I")
{
h[k] = x;
}
else
{
cout << (h[k] != null ? "Yes" : "No") << endl;
}
}
return 0;
}