字符串哈希
哈希
哈希的计算是单方面的(a->b ,b-!->a)
过程:
一行数:1 4 70
分别取余7.将余数放到对应位(数组中)上
1%7=1
4%7=4
70%7=0
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
70 | 1 | - | - | 4 | - | - | - |
像这样存放,我们查找一个数存不存在的时间复杂度近似为O(1)
哈希冲突
一列数取余一个数的值相同
如 1 4 70 8
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
70 | 1,8 | - | - | 4 | - | - | - |
1与8如何存放产生问题
解决:
1)向后继续寻找空的地址,存放进去。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
70 | 1 | 8 | - | 4 | - | - | - |
2)像链表一样存放第二个数的地址
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
70 | 1 | - | - | 4 | - | - | - |
8 |
字符串哈希
将字符串每个字符转换为ASCII码,转为10进制数,再累加它的128次幂,这个数就是字符串哈希值
hello:
(h->104 e->101 l->108 l->108 o->111)^128=8566686
代码:
long long Hash(string s){
has[0]=s[0]%mod;
for(int i=1;i<s.size();i++){
has[i]=(has[i-1]*128+s[i])%mod;
return has[s.size()-1];
}
求字串哈希值:
long long get(int l,int r){
return(has[r]-has[l]*pw[r-l+1]%mod+mod)%mod;
}
pw[i]为128的i次方。
通过字符串哈希,我们可以判断两个字符串是否相同