1. 开放定址法
一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。 发生冲突,另寻他处
我们把这种解决冲突的方法称为线性探测法。 我们在解决冲突的时候,还会碰到比如说一个数 48, 它所在的位置已经被占用,它只能往后延,但是又与后面的冲突 ,本来两个数一点关系都没有,但是发生冲突,这种现象称为堆积, 堆积的出现使得我们需要不断处理冲突,即48要不断向后延。
存入以及查找的效率都会大大降低。
————优化方案:
改进 d i = 12 , -12 , 22, -22 …… q2 , -q2 (q <= m/2),这样就等于可以是双向寻找可能的位置了,
- 增加平方运算的目的是为了不让关键字都聚集在某一个区域,我们称这样的方法为二次探测法。
————改进方案:
在冲突时,对于位移量 d 1 采用随机函数计算得到,我们称之为随机探测法。(伪随机)
2. 再散列函数法:
准备多个散列函数,比如前面说的除留余数、折叠、平方取中全部用上,每当发生散列地址冲突时,就换一个散列函数计算,这种方法使得关键字不产生聚焦,当然也会增加计算的时间 不断尝试
3. 链地址法
将所有关键字为同义词的记录存储在一个单链表中,我们称这种表为同义词子表,不是同义词放在多个位置了,而是把他们集中起来, 在散列表里只存储所有同义词子表的头指针。
- 链地址法对于可能会造成很多冲突的散列函数来说,提供了绝不会出现找不到地址的保障。当然,这也会增加查找时需要遍历单链表的性能损耗。
4. 公共溢出区法
把冲突的关键字存储在溢出表中,在查找时,对给定值通过散列函数计算出散列地址后,先与基本表的相应位置进行对比,如果相等,则查找成功,如果不相等,则到溢出表去进行顺序查找。
- 如果对于基本表而言,有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高的。