目录

一、哈希冲突

二、 解决Hash冲突

2.1 开放地址法

2.1.1 线性探测法

2.1.2 二次探测法

2.2 再哈希法

2.3 链地址法

2.4 建立公共溢出区


一、哈希冲突

Hash冲突指的是在向Hash表中存数据时,首先要用Hash函数计算出该数据要存放的地址。但是在这个地址中已经有值存在,所以这个时候就发生了Hash冲突。也就是一句话:key值不同的元素可能会映象到哈希表的同一地址上。

二、 解决Hash冲突

2.1 开放地址法

一旦产生冲突,就去寻找下一个空的哈希地址。只要哈希表足够大,空的哈希地址总能找到,并将数据元素存入。其数学递推公式为

式中,i=1 , 2 , ... , k(k<=m-1);m表示哈希表表长; 为增量序列。

2.1.1 线性探测法

=1 , 2 , ... , m-1时称为线性探测法。其特点为:发生冲突时,顺序查看表中的下一个单元,当探测到表位地址m-1时,下一个探测地址是表首地址0,直到找出一个空闲单元(当表尾填满时一定能找到一个空闲单元)或查遍全表。

例如,哈希表表长为10,以关键字的末尾数字作为哈希地址,依次插入45、22、13、65、29、42、79、2共8个记录。若发生冲突则采用线性探测法。

1)首先先插入45,22,13,由于是在哈希表为空的时候插入,就直接插入在对应的地址上。(图a)

2) 在图a的基础上插入65,29,42,在插入42和65时,都发生了冲突,然后就都依次往下一个单元走,若有空闲单元则直接插入;若没有空闲单元,则继续往下一个单元走,直到找到空闲单元。(图b)

3)  在图b的基础上插入79,2,原理是跟上面一样的。但在插入79时,发生冲突,该位置为哈希表的表尾,所以就只能从哈希表的表首开始找空闲单元。(图c)

4)  在图c的基础上插入64,在插入64时,该位置已经被42给占了,但是这个位置原本不属于42的,像这种情况我们成为“堆积”。然后只能往下一个单元走,直到找到空闲单元。(图c)

2.1.2 二次探测法

,其中k<=m/2,m必须是一个可以表示成4k+3的质数时,称为二次探测法,又称平方探测法。二次探测法是一种较好的处理冲突的方法,可以避免出现“堆积”问题,它的缺点是不能探测到哈希表上的所有单元,但至少能探测到一半的单元。

例如,若有关键字集合{47,7,29,11,16,92,22,8,3}, 哈希表表长为11,哈希函数为H(k)=k%11,用二次探测法处理冲突,得到的哈希表如图2.2.2

为关键字寻找空的哈希地址时只有关键字3与线性探测法不同,H(3)=3,哈希地址发生冲突,有,仍然冲突:,找到空的哈希地址,将3存入。

2.2 再哈希法

同时构造多个不同的哈希函数。

2.3 链地址法

将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

2.4 建立公共溢出区

将哈希表分为基本表溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。

Hash冲突以及如何解决Hash冲突相关推荐

  1. 【除留余数法定义hash函数+线性探测法解决hash冲突】数据结构实验之查找七:线性之哈希表

    Think: 1知识点:除留余数法定义hash函数+线性探测法解决hash冲突 数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB P ...

  2. 再也不怕SVN冲突:轻松解决SVN冲突

    什么时候容易出现冲突? 多个人同时修改了同个文件中的同一行代码 无法进行对比的二进制文件,比如图片等 如何解决冲突? 如上图,test_conflict.py文件发生了冲突,并且多出了几个文件,其中. ...

  3. pci 中断冲突_如何解决IRQ冲突

    轻松分配板卡资源 中断是计算机处理特殊问题的一个过程,当计算机执行程序的过程中出现某个特殊情况时,会暂时中止现行程序,转去执行这一事件的程序,处理完毕之后再回到原来程序的中断点继续执行的整个过程叫做中 ...

  4. Maven中 jar包冲突原理与解决办法依赖传递

    Maven中 jar包冲突原理与解决办法&依赖传递 管理包依赖是 Maven 核心功能之一,下面通过如何引入 jar 包:如何解析 jar 包依赖:包冲突是如何产生:如何解决包冲突:依赖管理解 ...

  5. int linux 原子操作_linux c++编程之多线程:原子操作如何解决线程冲突

    在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作. 1.线程冲突 #include #include #include #include int g_count = 0;vo ...

  6. git 申请合并冲突:rebase 解决合成一条再合并

    问题描述 申请合并时出现:Merge blocked: the source branch must be rebased onto the target branch. 要求 source bran ...

  7. ThreadLocal源码阅读四:如何解决hash碰撞的?

    背景 推荐阅读ThreadLocal工作过程 推荐阅读ThreadLocal的魔数引发的疑问与思考 什么样的使用场景会出现hash碰撞? 如何解决hash碰撞的? 过程 可能产生hash碰撞的场景 分 ...

  8. 解决hash冲突的常用方法

    解决hash冲突的常用方法 参考文章: (1)解决hash冲突的常用方法 (2)https://www.cnblogs.com/fxtx/p/11588581.html (3)https://www. ...

  9. HashMap解决hash冲突的方法

    HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...

  10. hashMap怎么解决hash冲突的

    2019独角兽企业重金招聘Python工程师标准>>> 学Java的都知道hashMap的底层是"链表散列"的数据结构也也可以说是hash表.在put的实话先根据 ...

最新文章

  1. Exchange Server学习---发送邮件
  2. linux查看上下文切换命令,Linux性能优化,Linux查看CPU上下文切换
  3. centos7中使用yum安装tomcat mysql 等
  4. lucene教程--全文检索技术详解
  5. tomcat启动成功 未加载项目_欣冠精密eHR系统项目成功启动
  6. PHP 字符串替换 substr_replace 与 str_replace 函数
  7. GitLab 服务器的迁移以及注意点
  8. 0.3:Before We Start
  9. 刚刚,自动驾驶路测国家规范出台:无人车即将开上更多实际道路
  10. 7.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 日志收集与分析
  11. 网吧服务器系统安装,网吧服务器和客户端安装教程
  12. cst自学教材_CST Microwave Studio入门与应用基础课程
  13. 春日街拍夯货 原来你离时尚只有一道水波纹的距离
  14. java 计算父亲节_java实现计算周期性提醒的示例
  15. Unix Domain Sockets
  16. 哈工大计算机学院崔启航,2014-2015年度哈尔滨工业大学学生先进集体及先进个人评选结果公示...
  17. python爬虫概述及简单实践
  18. [全]win7成功干掉win8--一个小U盘引发的血案(U盘在win8下装win7的方法)Lenovo V580c
  19. 大数据平台数据管控整体解决方案(48页PPT附下载)
  20. PyCharm 字母大小写切换

热门文章

  1. Redis下载部署配置运行及修改登录地址、端口和密码
  2. 什么是CTI?呼叫中心系统CTI技术的应用
  3. 密码套件 and 弱密码套件漏洞
  4. wms仓库管理系统中条形码管理的两大优势
  5. paraview打开黑屏_ParaView使用指南---ParaView-1.4-使用指南.pdf
  6. [Linux驱动炼成记] 06-博通WIFI模组AP6212配置
  7. 计算机二进制教案教程,计算机的二进制教案.doc
  8. 利用匈牙利法求解指派问题
  9. 爬虫~爬爬爬~task1
  10. JDK环境变量的两种配置方法——以JDK8和JDK10为例