先简单了解下哈希函数和哈希冲突的概念。

哈希函数:在元素关键字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冲突的解决方法相关推荐

  1. HashMap 中 hash 冲突的解决方法及原理分析

    我们最先衰老的不是容貌,而是不顾一切的闯劲.有时候,要敢于背上超出自己预料的包袱,真的努力后,你会发现自己要比想象的优秀很多. HashMap冲突的解决方法比较考验一个开发者解决问题的能力. 在Jav ...

  2. HashMap的实现原理及hash冲突(碰撞)解决方法

    HashMap 采用一种所谓的"Hash 算法"来决定每个元素的存储位置.当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode ...

  3. element-ui和semantic-ui冲突的解决方法--局部引入semantic-ui的css

    element-ui和semantic-ui冲突的解决方法--局部引入semantic-ui的css 参考文章: (1)element-ui和semantic-ui冲突的解决方法--局部引入seman ...

  4. 我爱Java系列---【 maven依赖版本冲突的解决方法】

    我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...

  5. Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突)

    Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) 参考文章: (1)Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) (2)ht ...

  6. 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) 参考文章: ...

  7. Git冲突与解决方法【转】

    本文转载自:https://www.cnblogs.com/gavincoder/p/9071959.html Git冲突与解决方法 1.git冲突的场景 情景一:多个分支代码合并到一个分支时: 情景 ...

  8. Hash冲突的解决--暴雪的Hash算法

    Hash冲突的解决--暴雪的Hash算法 https://usench.iteye.com/blog/2199399 https://www.bbsmax.com/A/kPzOO7a8zx/ 转载于: ...

  9. Github上的版本和本地版本冲突的解决方法

    Github上的版本和本地版本冲突的解决方法 远程和本地版本冲突 情景: 在github上创建项目,然后本地git init 然后没有git pull -f --all 然后git add .  | ...

  10. eclipse安装emmet之后ctrl+d热键冲突的解决方法

    eclipse安装emmet之后ctrl+d热键冲突的解决方法 参考文章: (1)eclipse安装emmet之后ctrl+d热键冲突的解决方法 (2)https://www.cnblogs.com/ ...

最新文章

  1. Database design best practice(1):关于primary key及其它
  2. 十分钟了解分布式计算:Spark
  3. 【转】Unity C# 调用C++ dll 问题集锦
  4. 【题解】Luogu P1011 车站
  5. C#连接基于Java开发IM——Openfire
  6. 接口的定义与实现(重要)
  7. 为什么私有GIT服务器上无法查看上传的代码?
  8. django基础入门(1)django基本配置
  9. jquery 利用CSS 控制打印样式
  10. 模板模式与策略模式/template模式与strategy模式/行为型模式
  11. dubbo源码-服务发现
  12. ua解析接口_截取字符串+ua解析访问来源+stream多级分组
  13. 什么专业的会学python语言_为什么要学习Python编程语言?哪些人适合学习Python?...
  14. FbinstTools制作多系统启动U盘(Windows+Linux)
  15. GPT-3的最强落地方式?陈丹琦提出小样本微调方法,比普通微调提升11%
  16. linux下查看计划任务,linux查看计划任务.docx
  17. word排版案例报告_轻松搞定论文格式,这是 Word 排版的正确姿势
  18. 前端js计算抽奖概率
  19. java处理器,JAVA注解处理器
  20. Could not find a version that satisfies the requirement cryptography (from pymysql) (from versions:

热门文章

  1. Android 刷机脚本工具箱
  2. 服务器网卡多路径配置文件,IPSAN(五)IPSAN多路径设置(客户端)
  3. 打印机打印时显示选择传真调解器或服务器,惠普打印机选择打印时为什么显示发送传真...
  4. 什么是信息安全管理体系
  5. 【java】汽车租赁系统_结课作业
  6. DOS获取注册表键值
  7. 转:二阶有源低通滤波器设计
  8. SSIM(结构相似性)-数学公式及python实现
  9. UML用例图怎么画 有手就会
  10. 经纬度距离、范围、方位角计算、坐标转换