哈希表

Posted on 2023-03-11 21:14  lyc2002  阅读(28)  评论(0)    收藏  举报

拉链法

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;
}