通过构造良好的哈希函数可以减少冲突,但一般不能完全避免冲突。因此解决冲突是哈希法的另一个关键问题。常用的解决冲突方法有以下四种。
- 开放地址法
这种方法也称再散列法,基本思想是当关键字key的哈希地址p = H(key)冲突时,以p为基础再产生一个新的哈希地址p1,p1再冲突时,再以p为基础,产生地址p2……知道产生一个不冲突的地址pi,再将key填入其中,这种方法都有一个通用的再散列表达式
Hi = (H(key)+ di)%m
其中H(key)是哈希函数,m为表长,di是增量序列,增量的取值方式不同,相应的再散列方式也不相同,主要有以下三种。
(1)线性探测再散列
i = 1,2,3,4……..m-1.
采用这种方法冲突发生时,查看下一单元,直到找到一个空的单元,或者遍历全表。
(2)二次探测再散列
m = 1^2,-1^2 ,2^2,-2^2……k^2,-k^2.(k < m/2).
采用这种方法冲突发生时在表的左右进行探测比较灵活。
(3)伪随机探测再散列
i = 伪随机数序列
具体实现时需要建立一个伪随机数