码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 解决哈希冲突的几种方式


    哈希冲突

    • 1. 什么是hash冲突
    • 2. 解决方式
        • 2.1 开放地址法
        • 2.2 链地址法
        • 2.3 再哈希法
        • 2.4 公共溢出区

    1. 什么是hash冲突

    哈希函数是一个映像,把任意长度的输入,通过Hash算法变换成固定长度的输出,这个输出就是Hash值;
    当两个不同的输入,产生了同一个输出值即为哈希冲突

    2. 解决方式

    2.1 开放地址法

    这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。

    线性探测法:在ThreadLocalMap中使用;
    在这里插入图片描述
    该方法一次探测下一个地址,直到有空的地址后插入,若整个空间都找不到空余的地址,则产生溢出;

    优点:只要哈希表还有位置,通过不断的探测,总能找到合适的位置。
    缺点:
    1.是探测的次数不可控,一旦探测次数骤增,会严重影响哈希表的读写性能;
    2.删除比较麻烦;

    2.2 链地址法

    将哈希码对应一个链表,插入元素时,如果哈希码冲突了,就将元素插入到链表,可选头插或尾插。
    查询时,遍历哈希码对应的链表。
    HashMap采用的就是这种方式。

    优点:处理简单,容易删除,只需要简单地删去链表上相应的结点即可;
    缺点:一旦哈希冲突多了,哈希表会退化成链表,查询效率会从O(1)变为O(n)。JDK8的HashMap针对这种情况有做优化,冲突超过8个会将链表转换为红黑树,提高查询效率。

    2.3 再哈希法

    采用哈希函数,而不是一个;
    如果第一个哈希函数计算的哈希码发生冲突了,就采用第二个哈希函数重新计算哈希码,直到不冲突为止;
    查询时也是一样,依次调用不同的哈希函数计算哈希码,直到Key相等。

    int hash = hash1(key)、hash2(key)、hash3(key)......
    
    • 1

    缺点:这种方式会增加哈希计算的开销,影响读写的效率。

    2.4 公共溢出区

    在创建哈希表的同时,再额外创建一个公共溢出区,专门用来存放发生哈希冲突的元素。查找时,先从哈希表查,查不到再去公共溢出区查。

    缺点:哈希冲突多了,公共溢出区会膨胀的非常厉害,查询的效率也有影响。

  • 相关阅读:
    Python练习题:根据一段单词,找出其中的最长单词
    设计模式的二十三招式——以入门者角度说说设计模式
    AWS China Elastic Beanstalk 填坑记(Python Flask)
    SpringBoot 请求参数校验
    NIO与BIO服务器端对比
    maven 项目添加 git-hook 脚本,约束提交内容格式
    数据结构基础内容-----第三章 线性表
    @Component注解的使用及解析
    让gorm代码飞起来,gorm+gmodeltool生成entity,让实体类代码更轻松。
    【Mysql】Mysql的启动选项和系统变量(二)
  • 原文地址:https://blog.csdn.net/Swofford/article/details/125993081
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号