1.用法:便于查找。
要查询的关键字 -> 便于查找的函数 (建立一一对应的关系)
大集合 -> 小集合 (例:存放 %p 同余数,0~p-1数组下标 -> 建立链表%p = 数组下标 通过链表存。

点击查看代码
const int modnum = 11;
vector<int> HashTable[modnum];//创建了一个包含11个vector的数组,用来存放哈希到相同位置的元素
int Hash(int x) { return x % modnum; }//判断将数放入哪个桶里
//插入新值
void Insert(int x) {
int addr = Hash(x);
HashTable[addr].push_back(x);////将数放入对应的桶里
}
//查找元素
bool IsExist(int x){
int addr = Hash(x);
int l = HashTable[addr].size();
for (int i = 0; i < l; i++) {
if (HashTable[addr][i] == x)
return true;
}
return false;
}
int main() {
Insert(...);
}
2.字符串哈希
用法:比较两个字串是否相等。
构造哈希函数:

c.:与字符串有关的映射(s -> c)
base:任意大于字符集中字符数量的素数
当两个字符串不同时,两个字符串对应的哈希函数的值相等的概率很小。故字符串是否相等可以通过哈希值判断。(优:避免按位比较 , 缺点:数据量大时(>1e6 字符串可能冲突,应该写双哈希进行比较)
任意子段的哈希值:前缀和思想。

要算 l - r 字串的哈希值则 要减去展开式的从1—l到1段,已经通过预处理得i的哈希值,故a[i-1]和a[r]差的为base的(r-l-1)次幂,即如图所示可得字串哈希值。
例题:字符串哈希
题解:求每段哈希值,存入数组,ans = 数组中不一样的值。(注意哈希值范围。
3.STR中的哈希:
k:下标 v:=_
(映射关系,k便于查找 v要查找的信息)
浙公网安备 33010602011771号