处理散列冲突的方法

1. 开放定址法

一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。 发生冲突,另寻他处
在这里插入图片描述
我们把这种解决冲突的方法称为线性探测法。 我们在解决冲突的时候,还会碰到比如说一个数 48, 它所在的位置已经被占用,它只能往后延,但是又与后面的冲突 ,本来两个数一点关系都没有,但是发生冲突,这种现象称为堆积堆积的出现使得我们需要不断处理冲突,即48要不断向后延。
存入以及查找的效率都会大大降低。

————优化方案

改进 d i = 12 , -12 , 22, -22 …… q2 , -q2 (q <= m/2),这样就等于可以是双向寻找可能的位置了,

  • 增加平方运算的目的是为了不让关键字都聚集在某一个区域,我们称这样的方法为二次探测法。
    在这里插入图片描述
    ————改进方案
    在冲突时,对于位移量 d 1 采用随机函数计算得到,我们称之为随机探测法。(伪随机)
    在这里插入图片描述

2. 再散列函数法:

准备多个散列函数,比如前面说的除留余数、折叠、平方取中全部用上,每当发生散列地址冲突时,就换一个散列函数计算,这种方法使得关键字不产生聚焦,当然也会增加计算的时间 不断尝试
在这里插入图片描述

3. 链地址法

将所有关键字为同义词的记录存储在一个单链表中,我们称这种表为同义词子表不是同义词放在多个位置了,而是把他们集中起来, 在散列表里只存储所有同义词子表的头指针。

  • 链地址法对于可能会造成很多冲突的散列函数来说,提供了绝不会出现找不到地址的保障。当然,这也会增加查找时需要遍历单链表的性能损耗。

4. 公共溢出区法

把冲突的关键字存储在溢出表中,在查找时,对给定值通过散列函数计算出散列地址后,先与基本表的相应位置进行对比,如果相等,则查找成功,如果不相等,则到溢出表去进行顺序查找。

  • 如果对于基本表而言,有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值