[学习笔记 #5] 哈希
[学习笔记 #5] 哈希
下面 [ ] 起来的是我还不确定的。
前言
从今年暑假到现在(2024.11.13),考了多少道哈希,我一道都没场切。前年 CSP-S T3 星战没想出哈希做法,去年 CSP-S T2 又没想出哈希做法。满满的黑历史……
早就想总结了,没时间。今天忍不住了。
哈希表
- 哈希表和下面说的哈希应该不是一回事。
- 概括:缩小范围。可以用来存储哈希值。
- 具体实现:
- 当集合
较大时,用一个函数 把 [映射] 到一个较小的集合 。 - 查找时给出
中的元素,对应回 中的元素。 - 但是
中的一个元素可能对应 中的多个元素,即哈希冲突(或称哈希碰撞)。- 两种解决方法:
- 让
中的每个元素挂一串( 中的)元素。查找时遍历这一串。 - 让
中的每个元素只对应一个( 中的)元素。那么每添加一个( 中的)元素时,如果对应的( 中)元素没有对应元素,就对应上,否则接着找,直到找到一个还没对应的,对应上。
- 让
- 两种解决方法:
- 当集合
- 实际使用:
- 可以用 map 或 unordered_map。map 带
,但 unordered_map [[可能会被卡]]。 - 可以用 pb_ds 里的哈希表。
- 可以用 map 或 unordered_map。map 带
过渡:用哈希解决判定性问题
- 接下来的哈希用于解决 判定性问题。
- 采用哈希的原因:常规方式难以判定。
- 方法:
- 我们找 充分条件或必要条件(不是充要条件) 来判定,使用哈希来简化问题。
- 通过随机和多次判定来降低错误概率。
- 可以从原命题或 [[原命题的否定]] 两方面考虑。
- 要 判断是否是某种情况,就要先选择哈希的方式(要有针对性),再得到这样哈希的话这种情况的值是多少或是什么情况,最后判断真实的哈希值是否满足条件。
不知道归到哪里去的技巧
- 四次方([可能] 要取模)。[使哈希值更离散。]
- 双哈希。
- 多次哈希。
集合哈希
-
通过运算的交换律来 [表现] 集合的 [无序性]。
-
可以转化为序列哈希:
-
方法一:
- 对集合中每个值,记录它的出现次数,记到一个序列(桶)上(给值固定了顺序)。
- 可重集:就是这样。
- 不是可重集:出现次数是
或 。
- 对这个序列跑序列哈希。
- 对集合中每个值,记录它的出现次数,记到一个序列(桶)上(给值固定了顺序)。
-
方法二:
- 对集合排序(规定某种顺序,不一定从小到大),跑序列哈希。
-
Sum Hashing
- 哈希值表示整个集合。
。 :对每个 赋一个随机值(相同的 赋的值相同)。
- 一个性质——判断集合中每个数的出现次数是否都是
的倍数(出现次数为 也可以):- 求和有对取模很友好的性质:如果一个数值的出现次数
,那么它的哈希值加起来 也为 。如果每个数值的哈希值之和 ,那么整个集合的哈希值(每个数的哈希值加起来,即每个数值的哈希值之和加起来)就也 。因此原命题能推出 Sum Hashing 的值 ,那么后者就是前者的必要条件。 - 看 Sum Hashing 的值
是否为 。- 如果不为
则说明集合中 每个数的出现次数都是 的倍数 一定不成立。 - 如果为
则说明 ~ 可能成立。 - [蒙特卡罗判定]。
- 如果不为
- 随机较多遍之后错误率就小到可以接受了。
- 题、错误率分析见:CF1746F Kazaee。
- 求和有对取模很友好的性质:如果一个数值的出现次数
Xor Hashing
- 二进制 Xor Hashing [较常见]。
进制 Xor Hashing。- 每一位分别相加,不进位,分别对
取模。
- 每一位分别相加,不进位,分别对
- 哈希值 一般 不表示整个集合,只表示每个元素出现次数
是否为 。- 如果集合中每个元素的出现次数都
,Xor Hashing 表示的就是整个集合。
- 如果集合中每个元素的出现次数都
- 本质:
- 把很多遍 取模的 Sum Hashing(就是上面写的 Sum Hashing 的“一个性质”部分)压到一起跑。因为每一位是独立的,每一位都相当于一次取模的 Sum Hashing。
- 错误率:
- 二进制 Xor Hashing 的话,在 [[int 或 long long]] 范围内随机,[一般] 这样跑一遍的错误率就刚好小到可以接受了。
- 相比 Sum Hashing 的优势:
- (二进制 Xor Hashing)二进制压缩,去掉了跑很多遍带的大概一只
。 - 异或性质优美,有时有妙用。(下面是二进制的,[更高的] 进制我不知道)
- 重复直接消掉:
- 树上简单路径的异或和:直接算到根的异或和,异或起来即可。
- [异或线性基]。(我还不清楚正确率)(咕咕咕)
- 重复直接消掉:
- (二进制 Xor Hashing)二进制压缩,去掉了跑很多遍带的大概一只
序列哈希
- 把下标加入计算中,从而 [表现] [有序性]。
- 字符串哈希。(多项式哈希。)
- 作用:判定相等。
- 可以预处理 Base 的幂来
取出一段的哈希值。 - 双哈希。
树哈希
还不会呜呜呜。
数据结构维护哈希值
- 哈希表。
- 其他数据结构。
咕咕咕。
以后来放题。
参考
2024.11.13
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!