一:hash表
也叫散列表,以key-value的形式存储数据,就是将需要存储的关键码值通过hash函数映射到表中的位置,可加快访问速度。
二:hash冲突
如果两个相同的关键码值通过hash函数映射到了表中的相同位置,则产生了“碰撞”及hash冲突。解决冲突的方式有多种,可根据实际情况选择。
三:解决方法
1.外部链址法
为hash冲突的关键码值建立单链表,将单链表的头指针保存在hash表的存储单元中。以HashMap为例,可以实例化一个初始容量为16和加载因子为0.75f的对象。首先会创建一个长度为16 的哈希表,相当于定义了一个由16个头指针(初始为空)组成的指针数组T[0...m-1],凡是hash结果为i的节点均插入到以T[i]为头指针的单链表中。数据越多,碰撞发生就越多,当哈希表的容量达到某个临界点时(数组长度*加载因子)就会对表进行扩容。扩容非常耗时,需要计算数据在新表中的位置并进行复制。所以如果事先知道HashMap中需要存储的数量,最好预设HashMap的初始容量能大大提升系统系能。
查找时间:链表查找时间+1;
2.再哈希法
也称作再散列法,当发生碰撞后使用不同的hash函数再次进行hash操作,直到不再冲突。
数据比较分散,但是增加了计算时间,不太可能进行删除操作。
3.建立公共溢出区
创建两个哈希表,一个为基本表,一个为公共表,如果需要存储的数据hash后和基本表中有冲突,则保存在公共表中,公共表为顺序表,可将冲突的数据一次插入到公共顺序表中。
查询数据的时候先根据hash值去基本表中查找,如果和数据不匹配再去公共表中顺序查找即可。
4.开放定址发
称作再散列法,当冲突发生后以同样的hssh函数再次进行不同规则的操作,直到不冲突为止。
表达式:Hi = (H(key) + di)%m i=1,2,3,...,n。根据di的的不同可分为:
1)线性探测再散列:di为线性函数即可,通常di = 1,2,3,...,m-1
冲突发生后顺序查找表中的下一个单元,直到找到空单元
2)二次探测再散列:di = 1^2,-1^2,2^2,-2^2,...,k^2,-k^2 (k<m/2)
冲突发生后,在表的左右两侧进行探测。
3)伪随机探测再散列:di = 随机数
冲突发生后,在表的位置随机进行探测。
查询操作则根据相同的存储规则进行查询操作即可。
特点:不太可能进行删除操作,当表快满状态时,效率下降。

hash冲突随笔的更多相关文章

  1. 链表法解决hash冲突

    /* @链表法解决hash冲突 * 大单元数组,小单元链表 */ #pragma once #include <string> using namespace std; template& ...

  2. [20181130]如何猜测那些值存在hash冲突.txt

    [20181130]如何猜测那些值存在hash冲突.txt --//今年6月份开始kerrycode的1个帖子提到子查询结果缓存在哈希表中情况:--//链接:http://www.cnblogs.co ...

  3. [20181130]hash冲突导致查询缓慢.txt

    [20181130]hash冲突导致查询缓慢.txt --//昨天看了链接https://jonathanlewis.wordpress.com/2018/11/26/shrink-space-2/, ...

  4. 解决hash冲突之分离链接法

    解决hash冲突之分离链接法 分离链接法:其做法就是将散列到同一个值的所有元素保存到一个表中. 这样讲可能比较抽象,下面看一个图就会很清楚,图如下 相应的实现可以用分离链接散列表来实现(其实就是一个l ...

  5. HashMap的hash冲突解决方案

    Hash函数 非哈希表的特点:关键字在表中的位置和它之间不存在一个确定的关系,查找的过程为给定值一次和各个关键字进行比较,查找的效率取决于和给定值进行比较的次数. 哈希表的特点:关键字在表中位置和它之 ...

  6. hash 冲突及解决办法。

    hash 冲突及解决办法. 关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突.解决办法: 1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列.沿 ...

  7. hash冲突解决和javahash冲突解决

    其实就是四种方法的演变 1.开放定址法 具体就是把数据的标志等的对长度取模 有三种不同的取模 线性探测再散列 给数据的标志加增量,取模 平方探测再散列 给数据的标志平方,取模 随机探测再散列 把数据的 ...

  8. [转]hash冲突的四种办法

    原文地址:http://blog.csdn.net/qq_27093465/article/details/52269862 一)哈希表简介 非哈希表的特点:关键字在表中的位置和它之间不存在一个确定的 ...

  9. Hash冲突的几种解决方法

    1. 开放定值法: 也叫再散列法,当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突 ...

随机推荐

  1. XManager5连接CentOS7

    XManager5连接CentOS6的方法已经行不通了,那么如何用XManager5连接CentOS7 从Xmanger官网博客得知: "Gnome in CentOS 7 tries to ...

  2. DDD领域驱动之干活(四)补充篇!

    距离上一篇DDD系列完结已经过了很长一段时间,项目也搁置了一段时间,想想还是继续完善下去. DDD领域驱动之干货(三)完结篇! 上一篇说到了如何实现uow配合Repository在autofac和au ...

  3. Array.apply(null,{length:20})与new Array(20)的区别

    Array.apply(null,{length:20}) 这句代码的实际意义:创建长度为20的一个数组,但并非空数组. 跟new Array(20)的区别在于,前一种创建方式,得到的数组中的每一个元 ...

  4. RDLC报表纵向合并单元格。

    在做RDLC报表时发现居然没有纵向合并单元格,震惊! 网上查了一些资料,有些方法很可爱,采用去除边框法,但是用这种方法如果要求文本属性居中的话那则达不到美观效果,还有些复杂一点的方法,我都没耐心看,然 ...

  5. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  6. 5.Smart使用内置函数或者自定义函数

    1.使用内置函数 例如使用date函数 {"Y-m-d"|date:$time}格式{第一个参数|方法:第二个参数:第三个参数}即可转换成 2016-07-19  2.使用resi ...

  7. ==,=和equals()区别

    equals和=,==的区别   一. ==和equals的区别 1. ==是运算符 2. equals是String对象的方法 一般有两种类型的比较 1. 基本数据类型的比较 2. 引用对象的比较 ...

  8. weblogic 部署问题定位与解决

    weblogic 做为商用中间件在(EJB.jndi 数据源.日志管理.内存管理.资源配置管理...)  是一些开源免费小型容器无法望其项背的. weblogic 最早由 weblogic Inc. ...

  9. 第一章:windows下 python 的安装和使用

    1. 主流的python版本和大部分人使用的版本都是 2.7 和3.6 2.安装 python2.7 和 python3.6的步骤 1. 下载 python对应的版本:选择使用的 系统, 64位和32 ...

  10. CSS学习(页外引用还不懂)

    CSS的语法结构为   选择符 {属性:值:}    Selector {Property : Value:} 选择符:通配 *{....}  , 元素  body{....} .h1{....}.p ...