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;
}
本文来自博客园,作者:流氓兔LMT,转载请注明原文链接:https://www.cnblogs.com/-include-lmt/p/18685649

浙公网安备 33010602011771号