`

hash冲突的解决方法小结

阅读更多
hash对于我们coder来说并不陌生,在我们使用hashmap和hashtable也许会有其底层实现的疑问,此处以hashmap第底层实现为例子进行说明,同时提出hash冲突的解决办法。
这里写图片描述
 
上图就是一个散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。但是当关键字数量比较大的时候,难免就会造成一个问题,就是不一样的关键字隐射到同一个地址上,这样就造成了一个问题,就是hash冲突。那么如何解决呢?
 
一般比较常用的方法有开放地址法:(内容来自百度百科)
1. 开放寻址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法:
1.1. di=1,2,3,…,m-1,称线性探测再散列;顺序查看表的下一单元,直至找到某个空单元,或查遍全表。
1.2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)称二次探测再散列;在表的左右进行跳跃式探测。
1.3. di=伪随机数序列,称伪随机探测再散列。根据产生的随机数进行探测。
2 再散列法:建立多个hash函数,若是当发生hash冲突的时候,使用下一个hash函数,直到找到可以存放元素的位置。
3 拉链法(链地址法):就是在冲突的位置上简历一个链表,然后将冲突的元素插入到链表尾端,
4 建立公共溢出区:将哈希表分为基本表和溢出表,将与基本表发生冲突的元素放入溢出表中。
 
底层的hashMap是由数组和链表来实现的,就是上面说的拉链法。首先当插入的时候,会根据key的hash值然后计算出相应的数组下标,计算方法是index = hashcode%table.length,(这个下标就是上面提到的bucket),当这个下标上面已经存在元素的时候那么就会形成链表,将后插入的元素放到尾端,若是下标上面没有存在元素的话,那么将直接将元素放到这个位置上。
当进行查询的时候,同样会根据key的hash值先计算相应的下标,然后到相应的位置上进行查找,若是这个下标上面有很多元素的话,那么将在这个链表上一直查找直到找到对应的元素。
使用哈希表可以快速的找到一个元素。在有大量的数据的时候,比普通的顺序查找要快的多。假设有10000条数据,如果采用顺序查找,最坏的情况下需要对比10000次能找到,最好的情况是1次。平均查找次数位(10000+1)/2,大约为5000次。换一种方式,如果把10000条数据通过hash值索引分成10组,每一组有1000条数据,这样每一次只需要先确定是哪一组,然后在1000条数据里查找,这样最坏的情况是1000次, 最好的情况是1次。平均查找次数为(1000+1)/2 ,大约为500次。比上面的方法快了10倍。
分享到:
评论

相关推荐

    个人HASH小结

    hash算法的简单实现 解决冲突基于线性探测

    哈希意义的小结

    ### 哈希意义的小结 #### 一、哈希概念概述 哈希技术是现代计算机科学中的一个重要组成部分,广泛应用于数据存储、信息安全、数据库管理等多个领域。它通过一种特殊的函数,将任意长度的数据转换为固定长度的哈希...

    算法设计和分析结课论文.doc

    算法设计和分析结课论文 Hash 技术 Hash 函数是把任意长度的二进制串映射到特定长度的二进制串函数,是最基本的二进制函数之一。Hash 函数也被称为“凑数函数”,但这个名称很少被采用,70 年代之前也被称为散列...

    动力节点-HashMap讲义.pdf

    ### 面试题小结 1. **HashMap 中 hash 函数实现:** 主要通过无符号右移 16 位然后与原哈希码进行异或操作实现高效哈希计算。 2. **当两个对象的 hashCode 相等:** 如果键的内容相同,则替换旧值;否则,新键值...

    vue单页缓存存在的问题及解决方案(小结)

    然而,这种方式在实际应用中可能会遇到一些问题,包括CSS样式冲突、事件绑定与销毁、音频播放控制、微信分享数据更新以及URL参数上报等。以下是对这些问题的详细分析及解决方案: 1. **CSS同名覆盖**:在使用 ...

    javascript的hashCode函数实现代码小结

    hash = char + (hash ) + (hash ) - hash; } return hash; } ``` SDBM算法使用字符加上一个左移6位和左移16位的哈希值,再减去原始哈希值,以得到新的哈希值。 - **Lose Code**: ```javascript function ...

    我的NodeJs学习小结(一)

    Node.js学习小结知识点详细解读: 1. 编程细节与效率: 在Node.js编程中,尽量减少不必要的操作,例如在遍历数组时通过预设循环变量的初始值和结束条件来避免每次都获取数组长度,尤其是在处理大数据量时,这样的...

    Python3.7 dataclass使用指南小结

    6. **继承**:`dataclass` 可以继承其他类,但要注意父类的 `__init__` 方法可能与 `dataclass` 自动生成的 `__init__` 冲突,需要谨慎处理。 7. **序列化**:`dataclass` 类与 JSON 序列化库(如 `json` 或 `...

    《数据结构课程总结》

    - 散列冲突解决策略包括开放寻址法(线性探测再散列、二次探测再散列等)和链地址法。 ### 总结 数据结构是计算机科学的基础之一,掌握不同类型的数据结构及其应用场景对于编写高效程序至关重要。通过本总结,我们...

    redis架构设计与实现.pdf

    **1.1.5 小结** SDS 在 Redis 中扮演着非常重要的角色,它既提高了 Redis 的安全性,也提升了字符串处理的效率。通过 SDS,Redis 实现了高性能的同时,也保持了简洁性和易用性。 --- ##### 1.2 双端链表 **1.2.1...

    数据结构期末考试试卷

    用拉链法解决冲突,建立 Hash 表,分别计算查找成功和查找失败情况下的平均查找长度。 知识点: Hash 表是一种查找表,它可以使用拉链法解决冲突。查找成功和查找失败情况下的平均查找长度可以通过计算来得到。 四...

    大型网站性能优化实战从前端网络CDN到后端大促的全链路性能优化 带书签完整版

    - **4.2.5 小结**:异步模型相比于同步模型,在高并发场景下表现更优。 **4.3 数据结构对性能的影响** - **4.3.1 HashMap的问题**:在大量数据操作场景中,HashMap可能出现哈希冲突等问题。 - **4.3.2 HashMap的...

    数据结构资源

    因此,选择一个好的散列函数的同时还需要有效的冲突解决策略。 **2. 顺序文件的修改问题** - **题目:** 顺序文件采用顺序结构实现文件的存储,对大型的顺序文件的少量修改,要求重新复制整个文件,代价很高,采用...

    redis设计与实现原理及运作机制

    在添加新键值对时,如果出现键的哈希值冲突,则Redis会采用链地址法解决冲突。即在相同的槽位上建立一个链表,将冲突的键值对插入到链表中。 **添加新键值对时触发了rehash操作** 当字典的负载因子达到一定阈值时...

    计算机考研数据结构试卷二(练习题含答案).pdf

    9. **HASH查找**:HASH查找的关键在于解决冲突和构造好的哈希函数。 10. **二叉排序树**:中序遍历二叉排序树得到的是有序序列。快速排序的最坏时间复杂度为O(n^2),平均时间复杂度为O(nlogn)。 11. **二叉树度数...

    pro git 完整、完美中文版...

    **1.7 小结** - **回顾**: 介绍了版本控制的重要性,Git的历史背景及其基本概念,并指导了如何安装和初步配置Git。 #### 二、Git基础 **2.1 取得项目的Git仓库** - **方式**: - 克隆现有仓库: `git clone &lt;url&gt;...

Global site tag (gtag.js) - Google Analytics