散列查找-(四)处理Hash冲突的方法

 

首先明确,我们希望散列地址均匀得分布在地址空间。

但是冲突还是会发生,咋办?

两个思路:开放定址,和链地址


开放定址法:

线性探测法

发生了i次冲突,就将下一次试探的地址增加di

hi(key) = (h(key)+di)mod TableSize

让我想起来大学半夜抢选修课,假设手速不够没选上足球(一),我会先在列表足球(一)上下看看,有没有足球(二)或者其他什么好的体育课

冲突容易聚集

 

平方探测法:

hi(key) = (h(key)±   {\color{Red} di^{2}})mod TableSize

二次聚集会比一次聚集轻,但还是会发生

数学上可以证明:TableSize是某个4k+3的素数时(k是正整数),平方探测法可以探测到整个散列表空间

 

双散列探测法:

hi(key) = (h(key)  +  i*h2(key))mod TableSize

可以弥补二次聚集

第二个散列函数h2(key)要是用不好,会暴雷!!!

 

再散列法:

扩大散列表,会出现停顿,如果用在救人的设备,那停顿可能就会要命

 

 

链地址:

分离链接法

冲突的关键词是同义词的数据对象通过结点链接存在同一个单链表里,HashMap也是这么用的吧

做实验啦!

{47,7,29,11,16,92,22,8,3,50,37,89,94,21}这14个关键字序列

使用h(key)=key mod 11 的散列方法

用分离链接法处理冲突

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值