hash冲突的解决方法
先简单了解下哈希函数和哈希冲突的概念。
哈希函数:在元素关键字k和位置p之间建立一种映射关系f,使得f(k) = p;创建哈希表时,通过哈希函数将元素k存在地址为f(k)的位置;查找元素也是通过哈希函数找到元素的存放位置,然后取出值;
哈希冲突:关键字的集合很多的时候,就有可能将两个关键字k1,k2的哈希函数计算结果相等,k1和k2的值肯定不能存放在同一个位置,就产生了哈希冲突;哈希冲突是不可避免的,只能尽量减少哈希冲突;
冲突的解决办法有三种:
1>开放定址法或者叫再散列法:
基本思想是,当产生哈希冲突时,即关键字key的地址p=hash(key)上已经有值了,那么这是以p为基础,产生另外一个哈希地址p1,如果p1不冲突了,那么就将元素key存在位置p1,如果p1也冲突,就计算hash(p1)=p2,不冲突就存在p2,冲突继续计算;
再散列有几种方式:
1>线性探测再散列:冲突发生时,查看下个位置是否空,然后遍历下去找到个空的地方存放;
2>二次探测再散列:冲突发生时,在表的左右进行跳跃探测,di=12 -12 22 -22....k2 -k2;
3>伪随机探测再散列:di=伪随机序列;
例子:hash表长度11,哈希函数是:
h(key) = key%11;那么h(47)=3,h(26)=4,h(60)=5;下一个关键字69,h(69)=3,与47冲突了
1>线性探测的解决方法:往后遍历找到个空的位置
0 1 2 3 4 5 6 7 8 9 10
47 26 60 69
2>二次探测再散列:下个哈希地址是h1 = (3+12)%11 = 4,冲突,再找下一个哈希地址,(3-12)%11 = 2,就放在第二个位置
3>再看看伪随机数的处理办法,假设随机数是:2 5 9 ,下一个哈希地址(3+2)%11 = 5,冲突,再找下一个,(3+5)%11 = 8,就放在8的位置了。
2> 再哈希法:
这种方法是同时构造多个不同的哈希函数:hi = rhi(key) i=1,2...k
当哈希地址rh1(key)冲突时,再计算hi = rh2(key)....直到不再冲突
3>拉链法
hashmap处理冲突的解决方法:将所有冲突的地址放在一个链表中,通过链表链接起来;
例如: 已知一组关键字(32,40,36,53,16,46,71,27,42,24,49,64),哈希表长度为13,哈希函数为:H(key)= key % 13,则存放的位置如图所示
位置 Entry
0
1 --> 40 --> 27 --> 53
2
3 --> 16 --> 42
4
5
6 --> 32 --> 71
7
8
9
10 --> 36 --> 49
11 --> 24
12 --> 64
hash冲突的解决方法相关推荐
- HashMap 中 hash 冲突的解决方法及原理分析
我们最先衰老的不是容貌,而是不顾一切的闯劲.有时候,要敢于背上超出自己预料的包袱,真的努力后,你会发现自己要比想象的优秀很多. HashMap冲突的解决方法比较考验一个开发者解决问题的能力. 在Jav ...
- HashMap的实现原理及hash冲突(碰撞)解决方法
HashMap 采用一种所谓的"Hash 算法"来决定每个元素的存储位置.当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode ...
- element-ui和semantic-ui冲突的解决方法--局部引入semantic-ui的css
element-ui和semantic-ui冲突的解决方法--局部引入semantic-ui的css 参考文章: (1)element-ui和semantic-ui冲突的解决方法--局部引入seman ...
- 我爱Java系列---【 maven依赖版本冲突的解决方法】
我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...
- Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突)
Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) 参考文章: (1)Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) (2)ht ...
- github上的版本和本地版本冲突的解决方法(Updates were rejected because the tip of your current branch is behind)
github上的版本和本地版本冲突的解决方法(Updates were rejected because the tip of your current branch is behind) 参考文章: ...
- Git冲突与解决方法【转】
本文转载自:https://www.cnblogs.com/gavincoder/p/9071959.html Git冲突与解决方法 1.git冲突的场景 情景一:多个分支代码合并到一个分支时: 情景 ...
- Hash冲突的解决--暴雪的Hash算法
Hash冲突的解决--暴雪的Hash算法 https://usench.iteye.com/blog/2199399 https://www.bbsmax.com/A/kPzOO7a8zx/ 转载于: ...
- Github上的版本和本地版本冲突的解决方法
Github上的版本和本地版本冲突的解决方法 远程和本地版本冲突 情景: 在github上创建项目,然后本地git init 然后没有git pull -f --all 然后git add . | ...
- eclipse安装emmet之后ctrl+d热键冲突的解决方法
eclipse安装emmet之后ctrl+d热键冲突的解决方法 参考文章: (1)eclipse安装emmet之后ctrl+d热键冲突的解决方法 (2)https://www.cnblogs.com/ ...
最新文章
- Database design best practice(1):关于primary key及其它
- 十分钟了解分布式计算:Spark
- 【转】Unity C# 调用C++ dll 问题集锦
- 【题解】Luogu P1011 车站
- C#连接基于Java开发IM——Openfire
- 接口的定义与实现(重要)
- 为什么私有GIT服务器上无法查看上传的代码?
- django基础入门(1)django基本配置
- jquery 利用CSS 控制打印样式
- 模板模式与策略模式/template模式与strategy模式/行为型模式
- dubbo源码-服务发现
- ua解析接口_截取字符串+ua解析访问来源+stream多级分组
- 什么专业的会学python语言_为什么要学习Python编程语言?哪些人适合学习Python?...
- FbinstTools制作多系统启动U盘(Windows+Linux)
- GPT-3的最强落地方式?陈丹琦提出小样本微调方法,比普通微调提升11%
- linux下查看计划任务,linux查看计划任务.docx
- word排版案例报告_轻松搞定论文格式,这是 Word 排版的正确姿势
- 前端js计算抽奖概率
- java处理器,JAVA注解处理器
- Could not find a version that satisfies the requirement cryptography (from pymysql) (from versions: