哈希冲突解决方法

哈希冲突解决方法

哈希冲突:不同 key 算出相同哈希值,映射到同一个数组下标

主要两大类:开放地址法、链地址法,还有一些优化方法。

一、开放地址法(数组内部解决,不额外开空间)

核心:冲突了就往后找空位

  1. 线性探测
    冲突就+1、+2依次往后找,简单但容易聚集,效率下降。
  2. 二次探测
    按平方步长找,缓解聚集。
  3. 双重哈希
    用第二个哈希函数算步长,分散性最好。

缺点:删除麻烦、容易堆积、负载因子不能太高。

二、链地址法 / 拉链法(最常用,HashMap 用这个)

每个数组位置挂一个链表/红黑树

  • 冲突的元素全部挂在同一个链表上
  • Java HashMap:链表长度>8 转红黑树,<6 退化成链表

优点:实现简单、删除方便、负载因子可以更大;
缺点:需要额外存链表节点。

三、其他方法

  1. 再哈希法:冲突就换一个哈希函数重新算
  2. 建立公共溢出区:冲突数据统一放溢出表

面试问答

1. HashMap 用什么解决冲突?

链地址法(拉链法)+ 红黑树优化
链表过长转红黑树,提高查询效率。

2. 开放地址法和链地址法怎么选?

  • 数据量小、追求省内存 → 开放地址
  • 数据量大、频繁增删 → 链地址法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ricky_Theseus

感谢大家,祝您生活愉快

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

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

打赏作者

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

抵扣说明:

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

余额充值