当前课程知识点:数据结构(下) > 第九章 词典 > (c)散列:散列函数 > 09C-5 M+A+D
我们接下来将要介绍的是MAD法
名字听起来多少有点恐怖
这种方法可以认为是除余法的改进或推广
是的 如果更为严格的考察均匀性
除余法的确还存在一定的缺陷
体现在两个方面 问题首先出在零点
无论表长M取值如何 0点总是会被映射到0点
也就是说 存在不动点
这与任何元素都拥有均等的概率
被映射到任何位置的原则是完全相悖的
其次 尽管其他的元素都大体拥有均等的概率被分配到各个桶中
但不同关键码之间的这种映射
却存在着某种简明的关联关系
具体来说 经过散列映射之后
相邻的关键码也必然依然的相邻
就此意义而言 除余法所拥有的均匀性只是低阶的
当然 我们更希望实现更高阶的均匀性
比如至少临近的关键码
在经过散列之后 不要继续的彼此临近
那么如何实现这种更高阶的均匀性呢
为此我们需要对除余法略作改进
除了表长继续取做素数 我们还需要另外两个整数
整个散列的计算过程包括三步
首先做一次乘法 再做一次加法
最后再做整除模余 这里的计算步骤增加了
但如此却可以针对性的修复此前的两个缺陷
你看出来了吗
是的 新引入的整数b 可以视作是偏移量
如此即可有效的消除不动点
而另一个引入的整数a呢 则扮演着步长的角色
也就是说 在经过散列变换之后 原本相邻的关键码
将变成间隔为a 从而不再继续相邻
当然 实际应用的需求多种多样的
我们这里暂且只考虑最普遍的应用
实际上在不同的场合
散列的原则都有可能发生变换 甚至翻转
比如 在某些特殊的场合
未必需要高阶的乃至通常的均匀性
比如在一些几何计算的场合
我们需要处理的往往是来自于高维空间中的一系列点
为了将它们压缩到更加低维的空间
我们往往也需要借助散列
此时我们对散列的要求可能恰恰相反
也就是要尽可能使得临近的关键码
被映射到临近的位置
这也就是所谓的Locality-Sensitive Hashing
散列技术在当今的信息处理中 之所以能够无处不在
恰恰在于它的这些准则是灵活的
再比如在我们这个课程中所讨论的主要技术
多是旨在将一个相对而言更大的空间
通过散列映射 压缩至一个相对而言更小的空间
而实际上反过来也是大有用处的
这也就是所谓的密码学
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试