0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HASH哈希游戏开发(技术方案):开放寻址法详解

開發丨KFZ433 来源:開發丨KFZ433 作者:開發丨KFZ433 2022-06-29 13:50 次阅读

什么是哈希开放寻址法?

开放寻址法,就是当发生哈希冲突时,重新找到空闲的位置,然后插入元素。寻址方式有多种,常用的有线性寻址、二次方寻址、双重哈希寻址:

​线性寻址​,当需要插入元素的位置被占用时,顺序向后寻址,如果到数组最后也没找到一个空闲位置,则从数组开头寻址,直到找到一个空闲位置插入数据。线性寻址的每次寻址步长是1,寻址公式​​hash(key)+n​​(n是寻址的次数)。 ​二次方寻址​,就是线性寻址的总步长的二次方,即​​hash(key)+n^2​​。 ​双重哈希寻址​,顾名思义就是多次哈希直到找到一个不冲突的哈希值。

pYYBAGK7566APp7lAABex73Fz_M407.png

采用开放寻址法解决哈希冲突,又该如何查找元素和删除元素呢?

查找元素的过程和插入元素类似,用相同的寻址方式,寻址的同时比对key或者value是否相等,相等则认为元素存在,不相等则继续寻址,​如果探测到空闲位置依然没有找到则认为该元素不存在​。

删除有些特别,​不能单纯的把要删除的元素设置为空​,因为在查找元素的过程中探测到的空闲位置是删除元素的位置,就会使得查找元素的寻址算法失效,本来存在的元素误判定为不存在。该如何解决这个问题呢?

​只需要删除元素不是物理删除而是逻辑删除​。给删除的元素做上delete标记,当查询元素寻址时遇到delete标记的位置时不会停下来而是​继续向后探测​,但是在插入元素寻址遇到delete标记的位置就会把应该删除的元素替换掉。

三种寻址方式都有着明显的不足:

线性寻址,寻址的性能虽然元素个数的增多逐步下降,最坏时间复杂度是O(n)。 二次方寻址,寻址的次数比线性寻址较低了,但是会因为步长是二次方,所以需要较长的数组长度,内存利用率可能较低。 双重哈希寻址,多次哈希可能会浪费时间,需要优质的哈希函数做支撑。

而整个开放寻址法的不足也很明显:

插入、查找、删除都需要寻址。 数组中元素越多,空闲位置越少,哈希冲突越剧烈。所以装载因子不能太大,要及时扩容减小冲突,但是数组内存利用率较低。

看似开放寻址法有挺多问题,但是也有一些优点:

数据都存储在数组中,可以有效地利用 CPU 缓存加快查询速度。 而且,这种方法实现的哈希表,序列化也简单,不像链表还要考虑指针。

总结而得,当数据量比较小、装载因子小的时候,适合采用开放寻址法。这也是 Java 中​​ThreadLocal​​​内部类​​ThreadLocalMap​​使用开放寻址法解决散列冲突的原因。

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4299

    浏览量

    62374
  • 哈希算法
    +关注

    关注

    1

    文章

    56

    浏览量

    10732
收藏 人收藏

    评论

    相关推荐

    半导体与高通合作开发边缘AI物联网解决方案

    半导体(简称ST)与高通公司旗下子公司高通技术国际有限公司(简称QTI)宣布,双方达成一项新的战略协议,合作开发基于边缘AI的下一代工业和消费物联网解决方案。双方将充分发挥互补优势
    的头像 发表于 10-12 11:25 426次阅读

    PRU开发详解

    电子发烧友网站提供《PRU开发详解.pdf》资料免费下载
    发表于 09-05 11:27 0次下载
    PRU<b class='flag-5'>开发</b><b class='flag-5'>详解</b>

    DDR4寻址原理详解

    )的寻址原理是计算机内存系统中至关重要的一个环节,它决定了数据如何在内存中被有效地存储和访问。DDR4的寻址原理复杂而高效,以下将详细阐述其关键要素和工作流程。
    的头像 发表于 09-04 12:38 493次阅读

    鸿蒙开发:Universal Keystore Kit 密钥管理服务 HMAC ArkTS

    HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),是一种基于Hash函数和密钥进行消息认证的方法。
    的头像 发表于 07-12 18:22 594次阅读

    寄存器寻址和直接寻址的区别

    寄存器寻址和直接寻址是计算机指令系统中的两种基本寻址方式。它们在指令的执行过程中起着至关重要的作用,决定了指令操作数的来源和目标。下面我们将介绍这两种寻址方式的特点、区别以及在实际应用
    的头像 发表于 07-12 10:42 1211次阅读

    鸿蒙开发:Universal Keystore Kit 密钥管理服务 HMAC C、C++

    HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),是一种基于Hash函数和密钥进行消息认证的方法。
    的头像 发表于 07-12 09:36 288次阅读

    游戏选天玑!联发科天玑游戏技术推动游戏生态高速发展

    等生态合作伙伴,共同研讨移动游戏领域的变革趋势,并为解决当前移动游戏面临的挑战提供了星速引擎自适应软件开发套件和硬件光线追踪技术解决方案,不
    的头像 发表于 05-07 14:21 490次阅读
    玩<b class='flag-5'>游戏</b>选天玑!联发科天玑<b class='flag-5'>游戏</b><b class='flag-5'>技术</b>推动<b class='flag-5'>游戏</b>生态高速发展

    STM32F439的HASH模块DMA传输计算问题求解

    项目中需要使用439的的HASH模块计算文件的MD5值,使用的DMA方式,为了提高CPU效率,让其他任务在DMA传输数据、硬件计算MD5期间可以得到运行,DMA的数据来自FMC外扩的SDRAM
    发表于 04-19 06:42

    电缆故障寻址定位|高压电缆故障及隐患监测方案|结构|双端测距

    缆故障及隐患监测方案开发与应用显得尤为重要。       来了解电缆故障寻址定位技术。当电缆发生故障时,迅速准确地找出故障点位置是修复工作的前提。传统的故障检测方法主要依赖工作人员的
    的头像 发表于 03-15 16:41 620次阅读

    开放原子开源大赛—基于OpenHarmony的团结引擎应用开发赛正式启动!

    “基于OpenHarmony的团结引擎应用开发赛”是开放原子全球开源大赛下开设的新兴及应用赛的赛题之一,本次赛题旨在鼓励更多开发者基于OpenHarmony 4.x版本,使用Unity中国团结引擎
    发表于 03-13 10:45

    智能照明应用解决方案:弱电控制强电照明技术详解

    智能照明应用解决方案:弱电控制强电照明技术详解
    的头像 发表于 01-24 17:53 1001次阅读
    智能照明应用解决<b class='flag-5'>方案</b>:弱电控制强电照明<b class='flag-5'>技术</b><b class='flag-5'>详解</b>

    PLC里面的立即寻址、直接寻址、间接寻址你都搞懂了吗?

    我们都知道西门子200plc有三种寻址方式:立即寻址、直接寻址、间接寻址;这里主要给大家区分下直接和间接寻址
    的头像 发表于 01-04 15:20 1944次阅读
    PLC里面的立即<b class='flag-5'>寻址</b>、直接<b class='flag-5'>寻址</b>、间接<b class='flag-5'>寻址</b>你都搞懂了吗?

    详解部分元等效电路在电磁仿真中的应用

    详解部分元等效电路在电磁仿真中的应用
    的头像 发表于 12-07 14:42 1072次阅读
    <b class='flag-5'>详解</b>部分元等效电路<b class='flag-5'>法</b>在电磁仿真中的应用

    redis hash底层实现原理

    Redis是一个开源的内存数据库,使用键值对存储数据。其中,Redis中的数据结构之一就是哈希Hash),它提供了一种将多个字段(Field)存储在一个键(Key)中的方法。那么Redis的哈希
    的头像 发表于 12-04 16:27 554次阅读

    SIMATIC S7-1500 PLC S7-SCL寻址详解

    寻址可分为直接寻址和间接寻址,以下分别介绍。
    的头像 发表于 12-04 09:29 2655次阅读
    SIMATIC S7-1500 PLC S7-SCL<b class='flag-5'>寻址</b><b class='flag-5'>详解</b>