【总结】字符串hash(7.25)
一.概述
Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的关系。Hash算法还具有一个特点,就是很难找到逆向规律。
Hash算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。 [1]
Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。 [2]
实现方式:取一个固定值P,把字符串看作P进制数,并分配一个大于0的数值,代表每种字符。取一固定值M,求出该P进制数对M的余数,作为该字符串的Hash值。可以使用unsigned long long类型存储这个Hash值。该算法很难产生冲突。一般取P=131或P=13331
二.例题
A.兔子与兔子
解析:求hash前缀和p,可以O(1)求出区间的hash值
B.雪花雪花雪花
解析:令
H
(
a
1
,
a
2
,
.
.
.
a
6
)
=
a
1
∗
a
2
∗
.
.
.
∗
a
6
+
a
1
+
a
2
+
.
.
.
+
a
6
H(a1,a2,...a6)=a1*a2*...*a6+a1+a2+...+a6
H(a1,a2,...a6)=a1∗a2∗...∗a6+a1+a2+...+a6
本题hash值是个轮换函数,其实并不是完美的字符串hash,所以要用链表解决冲突。hash只能判断两个完全相同的字符串,而本题大可不必将所有排列都枚举出来。
C.Hash 键值 (hash)
思路:本题并不是hash,而是将 O ( n ∗ n ) O(n*n) O(n∗n)优化成了 O ( n ∗ s q r t ( n ) ) O(n*sqrt(n)) O(n∗sqrt(n))
具体做法是:
- 对于x<=sqrt(n),用 O ( s q r t ( n ) ) O(sqrt(n)) O(sqrt(n))维护数组, O ( 1 ) O(1) O(1)查讯
- 对于x>sqrt(n),用 O ( 1 ) O(1) O(1)维护数组, O ( s q r t ( n ) ) O(sqrt(n)) O(sqrt(n))查讯
相当于用两种做法分摊了时间复杂度,本题的解法不禁让人想到了巧妙的前缀和优化。说明有的最优的解法其实取决于数据,并不一定只与m,n有关。
D.三个朋友
思路:这道题其实并不难。枚举去掉的点,剩下的2*len的序列,只需判断
h
a
s
h
(
1
,
l
e
n
)
=
=
h
a
s
h
(
l
e
n
+
1
,
l
e
n
∗
2
)
hash(1,len)==hash(len+1,len*2)
hash(1,len)==hash(len+1,len∗2)
而原始字符串只可能是(1,len)或(len+2,n),当且仅当两个字符串不相等且均为解时输出"NOT UNIQUE".
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530415.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」