哈希学习笔记

大概日后会更新(?)

零.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)

posted @ 2020-10-19 16:37  千载煜  阅读(165)  评论(1编辑  收藏  举报