字符串哈希

字符串哈希

哈希

哈希的计算是单方面的(a->b ,b-!->a)
过程:
一行数:1 4 70
分别取余7.将余数放到对应位(数组中)上
1%7=1
4%7=4
70%7=0

01234567
701--4---

像这样存放,我们查找一个数存不存在的时间复杂度近似为O(1)

哈希冲突

一列数取余一个数的值相同
如 1 4 70 8

01234567
701,8--4---

1与8如何存放产生问题
解决:
1)向后继续寻找空的地址,存放进去。

01234567
7018-4---

2)像链表一样存放第二个数的地址

01234567
701--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次方。
通过字符串哈希,我们可以判断两个字符串是否相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值