目录
既是查找技术,也是存储技术。
适用于实际出现的关键字数目远小于可能取值的数目的情况。
0.基本概念
1.哈希函数【散列函数】:Key为关键字,H【Key】为Key在表中的位置
2.哈希地址:由Hash函数得到的存储位置。
3.装填因子:散列表空间大小为n,填入表中的节点个数为m,α = m / n 。
4.冲突【Collision】:H【K1】= H【K2】。
5.同义词:发生冲突的K1与K2。
6.哈希表:根据哈希函数 H【Key】和所选中的解决冲突的方法,将一组关键字映射到一个有限的、地址连续的地址集合(地址区间)上,如此得到的查找表为“哈希表”。
哈希表分为:内散列表(数组)与外散列表(链表)
1.散列函数的构造方法
「非数字型的关键字要先进行数字化处理」
1.直接定址法
H【Key】 = Key ,或者 H【Key】 = k * Key + b (也就是使用一个一一映射的双射函数)
优点:没有冲突。
缺点:关键字集合很大时,浪费严重。
2.质数除余法
设桶数为 B ,取质数 m <= B ,H(Key) = Key % m 。
3.平方取中法
取 Key * Key 所得数值的中间的几位数为散列地址。
目的是扩大差别,且能受到整个关键字各个数位的影响。
4.折叠法
将关键字分割成若干部分,然后取其叠加和为哈希地址。
两种叠加方式:位移叠加,间界叠加。
适用于关键字位数特别多的情况。
例如图书编号: 0-442-20586-4
5864 + 4220 + 04 = 10088
左:位移叠加—— H(Key) = 0088 「对齐」
右:间界叠加—— H(Key) = 6092 「折叠」
5.数字分析法
仅适用于能够预先估计出全体关键字的每一位上的各种数字出现的频率。
6.随机数法
用于应对长度不等的关键字
7.构造Hash函数所需要考虑的几个方面
取决于关键字集合的情况,关键字的大小、范围、类型、特征。
总原则是产冲突的可能性尽可能地小。
1.计算Hash函数所需要的时间
2.关键字的长度
3.散列表的大小
4.关键字的分布情况
5.记录的查找频率
2.解决冲突的方法
1.开放定址法
2.再散列法
H(key) = key % 13
key 为关键字,采用开放地址法中的线性探测再散列解决冲突
依次输入11 个关键字:16,74,60,43,54,90,46,31,29,88,77
构造哈希表
设关键字序列为:(62,30,18,45,21,78,66,32,54,48),
哈希函数为:hash(k) =k % 11,
采用二次探测再散列处理冲突,将其散列到地址空间为0到10的哈希表中,
在等概率条件下查找成功时的平均查找长度为?
探测过程:x+ 1^2, x - 1^2,x+ 2^2, x - 2^2
如图,例如45%11=1,放在1的位置,78%11=1,位置冲突,探测1+1^2=2位置,2位置没有关键字则放入,否则继续探测。
平均查找长度ASL=(1+1+3+1+1+2+1+3+4+1)/10=1.8
3.链地址法
4.公共溢出区建立法
3.平均查找长度
ASL
1.选用的哈希函数
2.选用的处理冲突的方法
3.饱和程度「装填因子」
默认各个位置存储数据的概率是相等的。