1. 用 `$10^9$` 代替 `10^9`
2. 用 `\bmod` 代替 `\mod`
要让 key 对应到内存中的位置,就要为 key 计算索引,也就是计算这个数据应该放到哪里。这个根据 key 计算索引的函数就叫做哈希函数,也称散列函数。举个例子,比如 key 是一个人的身份证号码,哈希函数就可以是号码的后四位,当然也可以是号码的前四位。生活中常用的“手机尾号”也是一种哈希函数。在实际的应用中,key 可能是更复杂的东西,比如浮点数、字符串、结构体等,这时候就要根据具体情况设计合适的哈希函数。哈希函数应当易于计算,并且尽量使计算出来的索引均匀分布。
-在 OI 中,最常见的情况应该是 key 为整数的情况。当 key 的范围比较小的时候,可以直接把 key 作为数组的下标,但当 key 的范围比较大,比如以 10^9 范围内的整数作为 key 的时候,就需要用到哈希表。一般把 key 模一个较大的质数作为索引,也就是取 $f(x)=x \mod M$ 作为哈希函数。另一种比较常见的情况是 key 为字符串的情况,在 OI 中,一般不直接把字符串作为 key,而是先算出字符串的哈希值,再把其哈希值作为 key 插入到哈希表里。
+在 OI 中,最常见的情况应该是 key 为整数的情况。当 key 的范围比较小的时候,可以直接把 key 作为数组的下标,但当 key 的范围比较大,比如以 $10^9$ 范围内的整数作为 key 的时候,就需要用到哈希表。一般把 key 模一个较大的质数作为索引,也就是取 $f(x)=x \bmod M$ 作为哈希函数。另一种比较常见的情况是 key 为字符串的情况,在 OI 中,一般不直接把字符串作为 key,而是先算出字符串的哈希值,再把其哈希值作为 key 插入到哈希表里。
能为 key 计算索引之后,我们就可以知道每个 value 应该放在哪里了。假设我们用数组 a 存放数据,哈希函数是 f,那键值对 (key,value) 就应该放在 a[f(key)]上。不论 key 是什么类型,范围有多大,f(key) 都是在可接受范围内的整数,可以作为数组的下标。