哈希表
1. 什么是哈希表
- 哈希表:也称为散列表,是一种数据结构,用于实现“键值对”映射关系。
- 哈希函数:为了使存储位置与关键字之间确立一个一一对应的关系,我们需要构造对应的哈希函数 f(key)。
- 哈希冲突:对于不同的关键字可能得到同一个哈希地址,即key1≠key2,而f(key1) = f(key2)。
假设f(key) = key MOD m;(m为哈希表表长,MOD为取余)
有关键字5 与 9,m 长为4,f(5) = f(9) = 1,他们会分配到同一位置,但是不同的关键字的位置应该不同,因此就产生了哈希冲突。
2. 哈希函数构造方法
条件:关键字为数字类型就可以直接进行哈希函数构造,如果是其他类型就要转化为数字形式表达。
- 直接定址法
要求:地址集合大小 == 关键字集合大小
方法:取关键字或关键字的某个线性函数值作为哈希地址。
应用情况:实际应用情况很少。
- 除留余数法
方法:取关键字被某个不大于哈希表表长m的数p除后的余数作为哈希地址。
条件:一般情况下,可以选p为质数或不包含小于20的质因数的合数。
应用情况:简单,应用广泛。
举例:
关键字集合:{1,3,6,7,10} 表长 m = 11
直接定址法:H(key) = key
除留余数法:H(key) = key MOD 5
在这个方法中1 与 6 的余数均为1,所以会产生哈希冲突,所以我们在创建哈希表时,不仅要有哈希函数,同时也要有处理冲突的方法。
3. 处理冲突方法
- 开放定址法
方法:对哈希函数获取到的值进行一定的处理从而获取到新的位置。
di的三种赋值方式
(1)线性探测再散列:设置di是i的常数倍
会产生二次聚集,在冲突过程中发生的两个第一个哈希地址不同的记录争夺同一个后继哈希地址。
(2)平方探测再散列:di为k从1开始的平方
m必为 4 * j + 3的质数,例:7,11,17
(3)随机探测再散列:di为另一个哈希函数,去获得另一个随机的数字
m 要与 di无公因子
举例
关键字集合:{19,1,23,14,55,68,11,86,37} 表长 m = 11
- 线性探测再散列
- 平方探测再散列
3. 随机探测再散列
- 链地址法
定义:将所有关键字为同义词的记录存储在同意线性链表中。
利用链式存储就可以避免冲突,每个关键字都拥有对应的位置。