哈希学习笔记
大概日后会更新(?)
零.HASH的用途
在数据范围不大的时候,你完全可以用一个map或者set来搞定
如果可以用c++ 11,你还可以用undered map来搞定
然鹅map也是hash实现的
所以当数据范围很大/你莫得c++11/出题人毒瘤的时候,就需要哈希
为了愉快的进行HASH,下面煮的栗子默认出题人卡掉了你的\(map\)并关掉了c++11
一.字符串HASH
我们想记录下关于一个字符串的信息(比如它是否出现过),就可以把这个字符串转化为一个\(p\)进制数,存进数组。当然也可以对这个\(p\)进制数取模。
就像这个亚子
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
r1[i]=(1ll*r1[i]*bas+s[i][j])%mod1;
r2[i]=(1ll*r2[i]*bas+s[i][j])%mod2;
}
}
//代码from yht
//这里因为有双哈希所以有两个数组
二.对一个数进行HASH
然鹅本质是取模
煮个栗子:当我们需要判断一个非常大的数是否出现过。
这时候,我们显然要让它取模,才能把它记录下来。
一道例题 解方程
多哈希
既然有了哈希,那肯定会存在哈希冲突。
那么我们可以对要哈希的东西多次哈希。
于是就有了双哈希和三哈希(据说冲突概率是线性缩小,实际上我也不知道)
(ps:建议模数>=n^2)