散列(哈希,Hash)入门
题单介绍
#### Ⅰ.散列表
散列表通过关键字访问某一特定元素,可以用来建立映射,平均时间复杂度优越。
除以下例题外,散列表在其他许多需要映射的地方也有用武之地(譬如杜教筛等筛法中)。因此不附过多例题。
- P1102 A-B 数对(建立散列表作为桶使用)
- P1955 [NOI2015]程序自动分析(散列表起工具作用,通过散列表建立映射实现并查集)
- P4398 [JSOI2008]Blue Mary的战役地图(矩阵的散列值作为关键字建立散列表)
#### Ⅱ.字符串散列
字符串散列通过散列函数将字符串的比较转化成整数的比较,可以大大减少时间复杂度。 滚动散列可以处理字符串匹配问题。
但需要注意的是字符串散列是可以被卡的,因此尽量使用双模数散列等技巧提高正确率,能够用其他方法时尽量选用其他方法。
- P3370 【模板】字符串哈希(模板)
- P2957 [USACO09OCT]Barn Echoes G(虽然数据范围略水但是其实可以利用前一次的散列值计算这一次的散列值,类似滚动散列)
- P3879 [TJOI2010]阅读理解(搭配 STL 基于平衡树的容器食用更佳)
- P1381 单词背诵(配合尺取法等处理单调问题的方法)
#### Ⅲ.树散列
将散列推广到树上,可以解决判断树是否同构的问题。
此部分内容本身稍难,故题目难度也稍大,建议先了解树上的简单动态规划等内容后再学习。
- P5018 对称二叉树(先搜索左子树先搜索右子树得到两组散列值再比较)
- P5043 【模板】树同构([BJOI2015]树的同构)(模板)
- P4323 [JSOI2016]独特的树叶(加入换根)