解决哈希冲突(四种方法)

目录

一、了解哈希表及哈希冲突

 二、解决哈希冲突办法 

1、开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址。

(1)线性探测法

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

 2、再哈希法

3、链地址法:将所有哈希地址相同的记录都链接在同一链表中。

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


一、了解哈希表及哈希冲突

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

哈希冲突:当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时,即称为发生了哈希冲突。简单来说就是哈希函数算出来的地址被别的元素占用了。


 二、解决哈希冲突办法 

1、开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址。

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

(1)线性探测法

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

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

举例:

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

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

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

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

        举例:


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


3、链地址法:将所有哈希地址相同的记录都链接在同一链表中。

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

 


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

  • 113
    点赞
  • 527
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
哈希冲突是指不同的键值对被哈希函数映射到了同一个桶中,解决哈希冲突方法主要有以下几种: 1. 链地址法(Chaining):在每个哈希桶中维护一个链表,发生冲突时将新的键值对插入链表中。这种方法简单易懂,但是可能会导致链表过长,影响查找效率。 2. 开放地址法(Open Addressing):当一个哈希桶被占用时,尝试将键值对插入到其他未被占用的桶中,直到找到一个空桶或者所有桶都被占用。常见的开放地址法包括线性探测、二次探测和双重哈希等。 3. 建立公共溢出区(Overflow Area):当哈希桶被占用时,将冲突的键值对存储在一个公共的溢出区中。这种方法需要额外的存储空间,而且查找效率可能会降低。 举个例子,假设我们有一个哈希表,其中存储了以下键值对: ``` {"apple": 3, "banana": 5, "orange": 2, "pear": 4} ``` 如果我们使用简单的取余哈希函数将键映射到桶中,可能会出现以下情况: ``` hash("apple") % 4 = 3 hash("banana") % 4 = 1 hash("orange") % 4 = 2 hash("pear") % 4 = 0 ``` 可以看到,"apple" 和 "pear" 映射到了同一个桶中,发生了哈希冲突。如果我们使用链地址法来解决冲突,可以在第三个桶中维护一个链表,将 "apple" 和 "pear" 存储在链表中。如果我们使用开放地址法来解决冲突,可以尝试将 "apple" 插入到第四个桶中,但发现已经被占用了,于是继续尝试第一个桶,发现空闲,于是将 "apple" 存储在第一个桶中。这样就避免了哈希冲突

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值