哈希
概念
一种映射的数据结构,可以理解为高级数组,通过一个键值查找任意一个字符串,数组,数对等
字符串哈希
基本哈希
字符串哈希实际上就是通过一个字符串各个位上的不同求出hash值,一个hash值映射一个字符串,我们可以
把字符串设为base进制(通常为131或1331),每一位代表字符串上的一个元素,通过比较两个字符串的hash值就可以快速比较两个字符串是否相同
ull hs(string x){
int l=x.size();
ull ans=0;
for(int i=0;i<l;i++)
ans=ans*b+(ull)x[i]+pr;
return ans;
}
这就是一个对字符串取hash值的操作,其中base一般为1331或131,pr是一个较大的质数即可(如233317)
板子
无冲突哈希
上述的hash求值在极端情况下hash值可能会有冲突,也就是两个不同字符串以上述算法所呈现的hash值相同,虽然出现概率极低但并非无法避免,这时候可以添加一个数组来记录每次的hash值,每次记录下新的哈希时如果与前面有冲突,就加上一个较大的质因数,直到不再冲突。当然,这种类似桶排的算法会受到空间内存的限制
多重哈希
实质上就是用两种不同的算法储存一个字符串的两个hash值,类似两个hash值坐标确定了一个字符串,可以把hash冲突的情况几乎避免掉