1 开放定址法
1.1 定义
开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址
1.2 要求
只要散列表足够大
空的散列地址总能找到,并将记录存入
1.3 线性探测法
使用该公式用于解决冲突的开放定址法称为线性探测法
对于线性探测法,在出现冲突时,它只能晚后一步一步检测看是否有空位置
假设此时该冲突位置后续没有可用位置,但前面有一个空位置
尽管可以不断地求余数后得到结果,但效率很差
1.4 二次探测法
因此可以改进该算法,增加双向寻找可能的空位置,这种新算法称为二次探测法:
1.5 随机探测法
此外还有一种方法是,在冲突时,对于位移量di采用随机函数计算得到,我们称为随机探测法:
注意:
这里的随机其实是伪随机数
即设置相同的随机种子,则不断调用随机函数的过程中就可以生成不会重复的数列
同时,在查找时,用同样的随机种子,它每次得到的数列也是相同的
因此相同的di就可以得到相同的散列地址
2 再散列函数法
2.1 散列函数
即提供多个散列函数:
2.2 解释
这里的RHi就是不同的散列函数然后每当发生散列地址冲突时
就换一个散列函数计算
相信总会有一个可以把冲突解决掉(todo:: how to search??)
2.3 优点弊端
2.3.1 优点
这种方法能够使得关键字不产生聚集
2.3.2 弊端
当然,相应地也增加了计算的时间
3 链地址法
3.1 定义
将所有关键字为同义词(即哈希地址相同)的记录存储在一个单链表中,我们称这种表为同义词子表
在散列表中只存储所有同义词子表的头指针
3.2 优点弊端
3.2.1 优点
链地址法对于可能会造成很多冲突的散列函数来说
提供了绝不会出现找不到地址的保障
3.2.2 弊端
当然,这也就带来了查找时需要遍历单链表的性能损耗
4 公共溢出区法
即为所有冲突的关键字建立一个公共的溢出区来存放
在查找时,对给定值通过散列函数计算出散列地址后先与基本表的相应位置进行比对如果相等,则查找成功如果不相等,则到溢出表去进行顺序查找如果对于基本表而言,有冲突的数据很少的情况下
公共溢出区的结构对查找性能来说还是非常高的