字符串哈希
哈希
哈希的计算是单方面的(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次方。
通过字符串哈希,我们可以判断两个字符串是否相同
本文详细介绍了哈希的单向计算过程,包括时间复杂度分析,以及哈希冲突的解决方法(如使用链表法)。重点讲解了字符串哈希的实现,通过ASCII码转换和128次幂运算得到哈希值,用于字符串相似性判断。
1129

被折叠的 条评论
为什么被折叠?



