散列表的删除与冲突处理 - 平方探测

接下来我们看冲突处理中的平方探测法(终于写出来了- -、),平方探测顾名思义就是探测增量是1²、-1²、2²、-2²…(线性探测是1、2、3、4……),平方探测与线性探测有点不同,线性探测是查找位置发生冲突后,就往后探测,后一个位置又有冲突的话,继续往后探测,直到找到空位置为止,所以说只要散列表上有空的单元格,线性探测就一定可以找到空位置。但是平方探测不一定,平方探测的做法是:查找某个位置,如果发现冲突了,先往后探测,就是往1²探测,如果1²位置也有冲突,就往前探测,探测-1²的位置,如果-1²位置为空就插入,不为空也就是有冲突就向2²位置探测,接着是-2²、3²、-3²……这样的平方探测法,是不是散列表中有空位就一定能够探测出来呢?我们看一个例子:

散列表的最大长度为5,表中已存在元素3个,假如此时插入了一个元素21,会出现什么样的情况?21对5求余得1,散列表上1这个位置已经有元素了,那么按照平方探测法就会去探测原来位置+1²这个位置(也就是散列地址为2),2这个位置有12这个元素了,接着往-1²位置,也就是下标为0的位置上,发现还有元素,再往2²位置探测,这时我们看,初始的散列位置1+2²等于散列地址为0这个位置,发现回到之前探测过的位置了,这个位置不行,就到-2²探测,等于又回到2这个位置。。。。你可以亲自验证一下,3²也是这样,4²也是这样,就是出现一种什么样的情况呢,散列表中是有空位置的,但就是一直查找不出来,这就很尴尬了。平方探测法的存在一定是有它的理由的,它的优点在于减轻线性探测的“聚集”现象(就是很多元素在相邻的散列地址上“堆积”了起来,这样会大大降低查找效率)。

      怎么办?看书上说:“有证明表示,如果散列表长度是某个4K+3(K是正整数)形式的素数时,平方探测法就可以探测到整个散列表的空间。这一点很重要,是我们能够放心使用平方探测法的理论保证。”

      好啦,

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值