拉链法
const int N = 100003; // 一般取数的个数的下一个质数
int h[N], e[N], ne[N], idx;
memset(h, -1, sizeof(h));
// 添加一个数
void add(int x)
{
int k = (x % N + N) % N;
e[idx] = x;
ne[idx] = h[k];
h[k] = idx;
idx++;
}
// 查找一个数
bool find(int x)
{
int k = (x % N + N) % N;
for (int i = h[k]; i != -1; i = ne[i]) {
int j = e[i];
if (j == x)
return true;
}
return false;
}
开放寻址法
const int N = 200003, null = 0x3f3f3f3f; // 一般取数的个数的 2~3 倍的下一个质数
int h[N];
memset(h, 0x3f, sizeof(h));
// 返回 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;
}