联系hashgameCONTACT hashgame
地址:广东省广州市
手机:13988889999
电话:020-88889999
邮箱:admin@qq.com
查看更多
Rhashgamehashgame
你的位置: 首页 > hashgame

HASH GAME - Online Skill Game ET 300每日一 R「12」数据结构(三)哈希表

发布时间:2025-12-12 20:34:48  点击量:

  HASH GAME - Online Skill Game GET 300

HASH GAME - Online Skill Game GET 300每日一 R「12」数据结构(三)哈希表

  官方文档中对哈希表的描述如上。从中我们可以看到两个关键元素:二次探查和 SIMD 查找。首先,学过数据结构的同学应该了解,哈希表主要用于将大量的可能输入映射(或散列)到有限容量的哈希表中。因为输入远远大于容量,所以就可能存在两个不同的输入,根据散列算法映射到哈希表中的统一位置(哈希碰撞或散列碰撞)。为了解决碰撞,可采用不同的算法,例如链地址法,即将碰撞的元素串联到链表中,Java 中的 HashMap 采用的就是这种方法。例如开放寻址法,即将碰撞的元素存储在当前位置向后线性查找、或非线性查找到的空闲位置。从上面的描述中,我们知道 Rust 中 HashMap 采用的是开放寻址法处理冲突,而且使用得是二次探查(非线性)。所谓二次探查就是指,遇到碰撞时,从当前位置向后查找,每次增加 2 的 n 次方,直到找到空闲位置。至于另外一个关键点 SIMD,在学习完数据结构后,我们再回过头来学习。

  Rust 哈希表中最重要的或者说最精髓的地方在于 ctrl 表的设计。当使用 HashMap::new() 方法创建哈希表后,在栈内存中会存在下图右上角所示的胖指针。初始时哈希表中没有任何元素,ctrl 指向默认的空表地址。当逐渐向表中插入数据后,会在堆上分配空间,ctrl 指向 ctrl table 位置,哈希表的表头地址可以通过 ctrl 地址减去 bucket_size * (key + value) 得到。

  Rust 在加载 ctrl table 时每次加载一个 group,即 16 字节。寻址时通过 hashCode 与 group 中的 ctrl byte 进行 mask 比较来确定位置。这就是前面提到的 Rust 中哈希表的第二个特性:SIMD 查表。SIMD 借助现代 CPU 单指令多数据集的能力,通过一个指令可以将多个相关数据(16 个 ctrl bytes)加载到内存,大大提高了查表的速度。

【返回列表页】

顶部

地址:广东省广州市  电话:020-88889999 手机:13988889999
Copyright © 2018-2025 哈希游戏(hash game)官方网站 版权所有 非商用版本 ICP备案编: