数据结构与算法——23.哈希冲突及其解决方法

这篇文章我们主要讲一下哈希冲突及其解决方法。

目录

1.哈希冲突的介绍

2.解决哈希冲突的方法

2.1 开放地址法

2.1.1 线性探测法

2.1.2 平方探测法(二次探测法)

2.2再哈希法

2.3链地址法

2.4建立公共溢出区

3.总结


1.哈希冲突的介绍

首先,我们来了解一下哈希表与哈希冲突。

哈希表:哈希表也叫散列表,底层是由数组+链表实现的,是一种实现关联数组和抽象数据类型的数据结构,这种结构可以将关键码映射到给定值。简单来说哈希表(key-value)之间存在一个映射关系,是键值对的关系,一个键对应一个值

哈希冲突:当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时(就是对应数组的同一个索引),即称为发生了哈希冲突。简单来说就是哈希函数算出来的值有重复的了。

2.解决哈希冲突的方法

下面来看一下解决哈希冲突的方法

2.1 开放地址法

开放定址法:我们在遇到哈希冲突时(就是有重复哈希码时),去寻找一个新的空闲的哈希地址(就是通过另一个哈希算法再算一个哈希码)。

举例解释:就是当我们去教室上课,发现该位置已经存在人了,所以我们应该寻找新的位子坐下,这就是开放定址法的思路。

具体实现方法有以下几种

2.1.1 线性探测法

开放地址法的实现发法之一就是线性探测法

当我们的所需要存放值的位置被占了,我们就往已生成的哈希码后面一直加1并对m取模,直到存在一个空余的地址供我们存放值,取模是为了保证找到的位置在 0~m-1 的有效空间之中。

公式:h(x) = ( Hash(x) + i ) mod ( Hashtable.length );( i 会逐渐递增加1)

如下图所示:

存在的问题:出现非同义词冲突(两个不想同的哈希值,抢占同一个后续的哈希地址)被称为堆积或聚集现象。

2.1.2 平方探测法(二次探测法)

当我们的所需要存放值的位置被占了,平方探测法会前后寻找而不是单独方向的寻找

公式:h(x) = ( Hash(x) + i ) mod ( Hashtable.length );( i 依次为 + ( i^2 ) 和 - ( i^2 ) )

如下图所示:

2.2再哈希法

除了使用开放地址法之外,我们还可以用再哈希法

再哈希法:同时构造多个不同的哈希函数,等发生哈希冲突时就依次使用第二个、第三个……等其他的哈希函数计算地址,直到不发生冲突为止。虽然不易发生聚集,但是增加了计算时间。

2.3链地址法

这个就是我们很常见的了,就是在数组后面加链表进行存储

公式:h(x) = x mod ( Hashtable.length );

如下图所示:

2.4建立公共溢出区

建立公共溢出区:将哈希表分为基本表和溢出表,将发生冲突的都存放在溢出表中。

这个就很简单了,不接受了。

3.总结

这篇文章介绍了哈希表,哈希冲突和解决哈希冲突的四种方法。我们主要还是用第三种方法,就是用链表来增加存储。其实都很好理解,不多说了。

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L纸鸢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值