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

    文章

    3868

    浏览量

    61309
  • 哈希算法
    +关注

    关注

    1

    文章

    56

    浏览量

    10690
收藏 人收藏

    评论

    相关推荐

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

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

    浅谈PLC编程的字节寻址和字寻址

    在PLC编程时,字节或多字节的变量一般支持绝对地址寻址(比如,IW0、MD4等)。要想正确寻址,则必须要搞清楚寻址的规则。目前常见的规则有两种:字节寻址和字
    发表于 01-24 10:51 199次阅读
    浅谈PLC编程的字节<b class='flag-5'>寻址</b>和字<b class='flag-5'>寻址</b>

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

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

    redis hash底层实现原理

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

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

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

    索引的底层实现详解

    说一说索引的底层实现? Hash索引 基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hashcode),并且Hash索引
    的头像 发表于 10-09 10:26 487次阅读
    索引的底层实现<b class='flag-5'>详解</b>

    哈希与加密有什么区别?

    哈希与加密有什么区别
    发表于 10-09 06:29

    基于Rust语言Hash特征的基础用法和进阶用法

    是一种通用的哈希算法,用于将任意类型的数据转换为固定长度的哈希值。下面是一个简单的示例,演示如何使用Hash trait计
    的头像 发表于 09-19 16:02 737次阅读

    什么是PLC直接寻址和间接寻址

    什么是PLC直接寻址和间接寻址?  PLC直接寻址和间接寻址是在程序设计中经常使用的两种方法。直接寻址指的是根据地址直接访问特定的内存单元,
    的头像 发表于 09-15 14:59 1660次阅读

    PLC中为什么要间接寻址?直接寻址不行吗?

    PLC中为什么要间接寻址?直接寻址不行吗? PLC,也称程序可编程控制器,是一种专门用于自动化控制的电子设备,广泛应用于各种工业领域中。在PLC编程中,常常用到寻址的概念,以便读取或控制具体的设备
    的头像 发表于 09-15 14:59 1158次阅读

    hash算法在FPGA中的实现(3)

    在前面的文章中主要介绍了hash表及其链表的结构,同时说明了如何读取表项。那表项是如何写入的了?前期的文章中有少量的提及,这里单独写一篇,介绍两种常见的方案
    的头像 发表于 09-07 17:02 398次阅读
    <b class='flag-5'>hash</b>算法在FPGA中的实现(3)

    hash算法在FPGA中的实现(2)

    如何解决冲突了。这里介绍两种常见的设计hash链表的方案。当然,解决hash冲突也不一定就要用链表的方法,还有其他方案
    的头像 发表于 09-07 17:02 410次阅读
    <b class='flag-5'>hash</b>算法在FPGA中的实现(2)

    hash算法在FPGA中的实现(1)

    在FPGA的设计中,尤其是在通信领域,经常会遇到hash算法的实现。hash算法在FPGA的设计中,它主要包括2个部分,第一个就是如何选择一个好的hash函数,减少碰撞;第二个就是如何管理ha
    的头像 发表于 09-07 17:01 601次阅读
    <b class='flag-5'>hash</b>算法在FPGA中的实现(1)

    STM32助力新产品设计提升安全性

    对称加密算法、AES-ECB模式缺陷与解决办法、Hash哈希函数、Hash哈希算法等。
    发表于 09-05 07:40

    如何区分西门子PLC的直接寻址和间接寻址

    我们都知道西门子200plc有三种寻址方式:立即寻址、直接寻址、间接寻址;这里主要给大家区分下直接和间接寻址
    的头像 发表于 08-28 14:43 957次阅读
    如何区分西门子PLC的直接<b class='flag-5'>寻址</b>和间接<b class='flag-5'>寻址</b>