一: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. 利用base64库暴力破解base加密

    做个base加密题python语法出了一堆错误..... 附上py中关于base加密/解码的知识:http://www.open-open.com/lib/view/open1433990719973 ...

  2. 【Appnium+C#+Winform自动化测试系列】前言

    目录(后期持续更新) 一.前言  1.为什么选择Appnium 最近这些年APP保持着持续的火热,对应的APP测试行业也是跟着水涨船高.由于市场的需求,APP测试平台也涌出大量的自动化测试工具. 在对 ...

  3. Google帝国研究——Google的产业构成

                                                                                        Google帝国研究--Goog ...

  4. nginx二级域名配置自动跳转到一级域名

    nginx二级域名配置自动跳转到一级域名 rewrite配置内容: if ($http_host !~ "^www.aaa.com$") { rewrite ^(.*) http: ...

  5. jquery 检测某元素是否含有某属性

    检测某元素是否含有某属性 if(typeof($("#aid").attr("rel"))=="undefined")

  6. 【CC2530入门教程-06】CC2530的ADC工作原理与应用

    第6课  CC2530的ADC工作原理与应用 广东职业技术学院  欧浩源 一.A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是AD ...

  7. 手机cpu结构,arm

    问题描述 今天测试人员测试集成版本时除了一个bug:关于华为 Mate 8手机Android 6.0系统运行刚刚提测的版本时,出现闪退的bug,而小米 4 手机Android 6.0系统却没有出现任何 ...

  8. 再谈AbstractQueuedSynchronizer:基于AbstractQueuedSynchronizer的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...

  9. CSS样式之连接方式

    前言:上一篇博客是HTML基本结构和标签,是笔者学习HTML的笔记,本篇博客开始记录CSS,废话不多说,直接进入主题. 首先,我们要知道CSS是什么.简单地说,CSS层叠样式表是用来表现HTML或XM ...

  10. Redis事务原理分析

    Redis事务原理分析 基本应用 在Redis的事务里面,采用的是乐观锁,主要是为了提高性能,减少客户端的等待.由几个命令构成:WATCH, UNWATCH, MULTI, EXEC, DISCARD ...