文章目录

  • 一、什么是hash冲突?
  • 二、产生hash冲突的原因
  • 三、解决hash冲突的4中方式
    • 1.开放地址方法
      • (1)线性探测
      • (2)再平方探测
      • (3)伪随机探测
    • 2.链式地址法(HashMap的哈希冲突解决方法)
    • 3.建立公共溢出区
    • 4.再哈希法

一、什么是hash冲突?

就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value键值对(这个是hashmap的存值方式),但是却发现算出来的地址上已经有人先来了
就是相当于你在蹲坑,又有人进来了,但是只有一个坑,就产生了冲突,需要开辟新的空间去让另一个人有地方上厕所。

二、产生hash冲突的原因

哈希是通过对数据进行再压缩,提高效率的一种解决方法。但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的值。这时候就产生了哈希冲突。

三、解决hash冲突的4中方式

1.开放地址方法

(1)线性探测

按顺序决定值时,如果某数据的值已经存在,则在原来值的基础上往后加一个单位,直至不发生哈希冲突。
就是在此空间不足时,直接放入此空间的后一个空的空间
如图:

(2)再平方探测

按顺序决定值时,如果某数据的值已经存在,则在原来值的基础上先加1的平方个单位,若仍然存在则减1的平方个单位。随之是2的平方,3的平方等等。直至不发生哈希冲突。
要注意平方不能超过容量的值
Size=16的时候,找备选的单元只能取i=1,2,3,也就是距离冲突单元1,4,9个单位的位置了。

(3)伪随机探测

按顺序决定值时,如果某数据已经存在,通过随机函数随机生成一个数,在原来值的基础上加上随机数,直至不发生哈希冲突。

2.链式地址法(HashMap的哈希冲突解决方法)

对于相同的值,使用链表进行连接。使用数组存储每一个链表。
就是hashmap的底层原理 :数组+链表 就是没有红黑树

优点:
(1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
(2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
(3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
(4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。
缺点:
(1) 指针占用较大空间时,会造成空间浪费,若空间用于增大散列表规模进而提高开放地址法的效率。

如图:

3.建立公共溢出区

建立公共溢出区存储所有哈希冲突的数据。

4.再哈希法

对于冲突的哈希值再次进行哈希处理,直至没有哈希冲突。


hash冲突(碰撞)及解决方法相关推荐

  1. hash冲突原理及解决方法

    在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMa ...

  2. 解决hash冲突的三个方法

    解决hash冲突的三个方法 参考文章: (1)解决hash冲突的三个方法 (2)https://www.cnblogs.com/wuchaodzxx/p/7396599.html 备忘一下.

  3. php5.3中ZendGuardLoader与wincache冲突问题的解决方法

    这篇文章主要介绍了php5.3中ZendGuardLoader与wincache冲突问题的解决方法,需要的朋友可以参考下 windows环境下,php5.3版本同时开始ZendGuardLoader和 ...

  4. error C2872: “flann”: 不明确的符号 --- PCL 与OpenCV2 的flann命名空间冲突问题的解决方法...

    error C2872: "flann": 不明确的符号 - PCL 与OpenCV2命名空间冲突问题的解决方法 error C2872: "flann" 如果 ...

  5. error C2872: “flann”: 不明确的符号 --- PCL 与OpenCV2 的flann命名空间冲突问题的解决方法

    error C2872: "flann": 不明确的符号 - PCL 与OpenCV2命名空间冲突问题的解决方法 error C2872: "flann" 如果 ...

  6. HashMap的实现原理及hash冲突(碰撞)解决方法

    HashMap 采用一种所谓的"Hash 算法"来决定每个元素的存储位置.当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode ...

  7. ip冲突 scan windows_Linux下IP 冲突查看及解决方法

    在linux下查看ip是否冲突的命令: 1.通过arping命令检测. arping 192.168.0.25 Unicast reply from 192.168.0.25 [00:25:e4:6c ...

  8. jar包冲突常用的解决方法

    转载自https://www.cnblogs.com/xiayangy/p/4038347.html jar包冲突常见的异常为找不到类(java.lang.ClassNotFoundException ...

  9. SVN版本管理工具使用中常见的代码提交冲突问题的解决方法

    相信刚开始学习使用SVN的小伙伴在项目合作开发的过程中一定经常遇到一些影响到自己编写的代码的苦恼,我这里列举了几种常见的问题以及问题的解决方法: 1.误删除和误操作的问题 问题1:有A和B两个人一块合 ...

  10. 哈希冲突四种解决方法

    哈希冲突的产生原因 哈希是通过对数据进行再压缩,提高效率的一种解决方法.但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的值.这时候就产生了哈希 ...

最新文章

  1. 科学界最牛的合影在这,能认全的都是大神!
  2. PXA270-基于ARM9内核Processor外部NAND FLASH的控制实现
  3. C# 目录必须是上个文本框的子级目录
  4. jenkins+sonar+ios 基于object C(object-c-plugin-snapshot免费版)搭建
  5. 基础知识(十四)服务器搭建
  6. PRD产品需求文档原型模版
  7. 蚂蚁链发布BTN,有什么用?
  8. selenium超详解
  9. python程序设计实训心得体会_20194220 实验四《Python程序设计》实验报告
  10. Unity 之自动化打包ipa
  11. 若依集成minio实现分布式文件存储
  12. 【一步步学OpenGL 27】 -《公告牌技术与几何着色器》
  13. 蛋白质语言建模?伯克利RoshanRao157页博士论文《训练,评估和理解蛋白质序列的进化模型》...
  14. 微信小程序相关操作示例
  15. Save More Mice (贪心 二分)
  16. 鸿蒙系统新平板,华为官宣新款MatePad Pro,首款鸿蒙系统平板
  17. 项目外包跟人力外包_您应该外包下一个开源项目吗?
  18. 小论文正文内容双栏,将脚注只分布在左侧栏设置方法:
  19. git获取代码,拉取最新代码,更新代码等
  20. 小羊驼和你一起学习cocos2d-x之二(屏幕匹配、多分辨率解决方案、分辨率适配)

热门文章

  1. python读取lmdb文件_LMDB文件读取器
  2. redis 下载源地址
  3. C#进行注册表项和键值操作
  4. 数据分析-信用卡反欺诈模型
  5. 简谈几种常用的库函数
  6. Xilinx平台SRIO介绍(六)SRIO收发测试
  7. Codelf插件的使用
  8. 将计算机设置成交换机主机名,各种交换机配置命令
  9. 小米便签开源项目本地环境搭建与分析
  10. SparkMLlib之01-Spark机器学习库介绍