对于哈希表,通常使用哪些数据结构来保存哈希表

What data structures are generally used hold to hash table for a hashmap

本文关键字:哈希表 数据结构 保存 常使用      更新时间:2023-10-16

我理解哈希键的检索被认为是O(1),键反过来可以指向实际数据。

我不明白的是,对于任意数量的可能的哈希值,我们通常如何存储哈希值。在我看来,这本身应该是一个允许稀疏值支持键值对的数据结构,例如std::map,不能用std:vector完成。

我在这里想说的是,如果你有一个32位的hasCode,你不可能从一开始就保持这个大小的数组,几乎所有的行都指向NULL,因为可能没有足够的数据。

散列键通常存储在数组或其他支持0(1)随机访问其元素的结构中。随着向哈希表中添加更多元素,结构的大小也会增加。当这种情况发生时,每个键值对通常会被重新散列。

为了在具有相对狭窄范围哈希桶的数组中存储范围广泛的哈希键,使用了模算子%和冲突解决策略。为了减少碰撞的数量,桶的数量被设置为素数。这减少了hashCode % bucketCount不均匀地将哈希码转向桶的可能性。

哈希表结构是一个数组结构,但是它没有那么多条目;相反,可以使用数组大小的模数运算来确定位置。这种模数操作(除了哈希值的大小有限和多个值可以产生相同哈希的事实之外)是必须处理冲突的原因之一。不同类型的哈希映射处理冲突的方式不同;流行的解决方案包括在每个条目上添加一个链表("链式"方法)或执行二次哈希并遍历数组以找到一个开放槽("开放寻址"方法);如dasblinkenlight的链接所示,还存在其他策略。

注意std::mapNOT一个哈希映射;它是一个基于树的映射结构,查找是O(log n)。然而,std::unordered_map是一个查找是O(1)的哈希映射结构。