一: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. Ajax 异步上传文件

    需要引用js jquery.form 前端代码 <form action="/Save" id="mainForm" method="post& ...

  2. 创建单页web app, 如何在chrome中隐藏工具栏 地址栏 标签栏?

    问题描述: 为使用更大的屏幕空间,在访问web应用的使用,如何隐藏地址栏.工具栏? 解决办法: 1. chrome的application mode 选项--->更多工具---->添加到桌 ...

  3. Cordova各个插件使用介绍系列(一)—$cordovaSms发送短信

    详情链接地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/cordova-1-cordovasms/ 这是调用手机发送短信的插件 ...

  4. [USACO09MAR]地震损失2Earthquake Damage 2

    地震破坏 时间限制: 1 Sec  内存限制: 128 MB 题目描述 威斯康星发生了一场地震!约翰的牧场遭到了打击,有一些牛棚变成了废墟,如果一间牛棚遭到 了破坏,那么所有和它相连的道路都不能使用了 ...

  5. 【Python3之socket编程】

    一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...

  6. 使用 Socket.IO 开发聊天室

    前言 Socket.IO 是一个用来实现实时双向通信的框架,其本质是基于 WebSocket 技术. 我们首先来聊聊 WebSocket 技术,先设想这么一个场景: · 用户小A,打开了某个网站的充值 ...

  7. TortoiseGit保存密码

    TortoiseGit保存密码 方法一:使用Bash命令 1.设置name和emailgit config --global user.name "yilei"git config ...

  8. sql嵌套批量更新

    嵌套批量更新 UPDATE CheLiang SET lineName = t.linename FROM TeamJiHua t ,CheLiang tc WHERE t.id = tc.teami ...

  9. 安装Dubbo注册中心(Zookeeper-3.4.6)

    样例视频教程:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd Dubbo建议使用Zookeeper作为服务的注册中 ...

  10. django-xadmin ModelAdmin中定义object_list_template无效的问题

    环境:https://github.com/y2kconnect/xadmin-for-python3.git python3.5.2 django1.9.12 object_list_templat ...