哈希冲突详解

简介: 哈希冲突详解

哈希冲突详解


一般来说哈希冲突有两大类解决方式


  1. Separate chaining
  2. Open addressing


Java 中采用的是第一种 Separate chaining,即在发生碰撞的那个桶后面再加一条“链”来存储,那么这个“链”使用的具体是什么数据结构,不同的版本稍有不同:


在 JDK1.6 和 1.7 中,是用 链表存储的,这样如果碰撞很多的话,就变成了在链表上的查找,worst case 就是 O(n);

在 JDK 1.8 进行了优化,当链表长度较大时(超过 8),会采用红黑树来存储,这样大大提高了查找效率。


(话说,这个还真的喜欢考,已经在多次面试中被问过了,还有面试官问为什么是超过“8”才用红黑树🤔)


image.png


第二种方法 open addressing 也是非常重要的思想,因为在真实的分布式系统里,有很多地方会用到 hash 的思想但又不适合用 seprate chaining


这种方法是顺序查找,如果这个桶里已经被占了,那就按照“某种方式”继续找下一个没有被占的桶,直到找到第一个空的。


image.png


如图所示,John Smith 和 Sandra Dee 发生了哈希冲突,都被计算到 152 号桶,于是 Sandra 就去了下一个空位 - 153 号桶,当然也会对之后的 key 发生影响:Ted Baker 计算结果本应是放在 153 号的,但鉴于已经被 Sandra 占了,就只能再去下一个空位了,

所以到了 154 号。


这种方式叫做 Linear probing 线性探查,就像上图所示,一个个的顺着找下一个空位。当然还有其他的方式,比如去找平方数,或者 Double hashing.


如果你喜欢这篇文章,记得给我点赞留言哦~你们的支持和认可,就是我创作的最大动力,我们下篇文章见!


我是小齐,纽约程序媛,终生学习者,每天晚上 9 点,云自习室里不见不散!

目录
相关文章
|
7月前
|
存储
学习散列表知识总结(三)
学习散列表知识总结(三)
66 1
|
7月前
|
存储 算法 Serverless
解决哈希冲突的方式
解决哈希冲突的方式
66 0
|
7月前
|
存储
学习散列表知识总结(一)
学习散列表知识总结(一)
48 0
|
7月前
|
算法
学习散列表知识总结(二)
学习散列表知识总结(二)
48 0
|
7月前
|
存储 Serverless 测试技术
从C语言到C++_30(哈希)闭散列和开散列(哈希桶)的实现(上)
从C语言到C++_30(哈希)闭散列和开散列(哈希桶)的实现
59 4
|
6月前
|
存储
开散列哈希桶
开散列哈希桶
|
7月前
|
存储 Java Serverless
从C语言到C++_30(哈希)闭散列和开散列(哈希桶)的实现(中)
从C语言到C++_30(哈希)闭散列和开散列(哈希桶)的实现
51 1
|
7月前
|
存储 NoSQL Serverless
从C语言到C++_30(哈希)闭散列和开散列(哈希桶)的实现(下)
从C语言到C++_30(哈希)闭散列和开散列(哈希桶)的实现
41 1
|
6月前
|
存储 人工智能 缓存
|
7月前
|
存储 C++ 容器
【C++】哈希 Hash(闭散列、开散列介绍及其实现)(上)
【C++】哈希 Hash(闭散列、开散列介绍及其实现)(上)