hash表

如果对于任意的键值,哈希函数计算出来的索引都不相同,那只用根据索引把 (key, value) 放到对应的位置就行了。但实际上,常常会出现两个不同的键值,他们用哈希函数计算出来的索引是相同的。这时候就需要一些方法来处理冲突。在 OI 中,最常用的方法是拉链法。
拉链法是在每个存放数据的地方开一个链表,如果有多个键值索引到同一个地方,只用把他们都放到那个位置的链表里就行了。查询的时候需要把对应位置的链表整个扫一遍,对其中的每个数据比较其键值与查询的键值是否一致。如果索引的范围是$ 1\ldots M\(,哈希表的大小为\) N\(,那么一次插入/查询需要进行期望\)O(\frac{N}{M})$ 次比较。

inline void add(ull a) // 添加元素
{
    ull modn = a % mod;
    nxt[++tot] = head[modn];
    head[modn] = tot;
    to[tot] = a;
    w[tot] = modn;
}
inline void clear() // 清空
{
    for (int i = 1; i <= tot; i++)
    {
        nxt[i] = head[w[i]] = 0;
    }
    tot = 0;
}
inline bool find(ull x) // 查找元素
{
    int modn = x % mod;
    for (int i = head[modn]; i; i = nxt[i])
    {
        int y = to[i];
        if (y == x)
        {
            return 1;
        }
    }
    return 0;
}
posted @ 2025-01-22 13:38  流氓兔LMT  阅读(13)  评论(0)    收藏  举报