对于哈希表,通常使用哪些数据结构来保存哈希表
What data structures are generally used hold to hash table for a hashmap
我理解哈希键的检索被认为是O(1),键反过来可以指向实际数据。
我不明白的是,对于任意数量的可能的哈希值,我们通常如何存储哈希值。在我看来,这本身应该是一个允许稀疏值支持键值对的数据结构,例如std::map,不能用std:vector完成。
我在这里想说的是,如果你有一个32位的hasCode,你不可能从一开始就保持这个大小的数组,几乎所有的行都指向NULL,因为可能没有足够的数据。
散列键通常存储在数组或其他支持0(1)随机访问其元素的结构中。随着向哈希表中添加更多元素,结构的大小也会增加。当这种情况发生时,每个键值对通常会被重新散列。
为了在具有相对狭窄范围哈希桶的数组中存储范围广泛的哈希键,使用了模算子%
和冲突解决策略。为了减少碰撞的数量,桶的数量被设置为素数。这减少了hashCode % bucketCount
不均匀地将哈希码转向桶的可能性。
哈希表结构是一个数组结构,但是它没有那么多条目;相反,可以使用数组大小的模数运算来确定位置。这种模数操作(除了哈希值的大小有限和多个值可以产生相同哈希的事实之外)是必须处理冲突的原因之一。不同类型的哈希映射处理冲突的方式不同;流行的解决方案包括在每个条目上添加一个链表("链式"方法)或执行二次哈希并遍历数组以找到一个开放槽("开放寻址"方法);如dasblinkenlight的链接所示,还存在其他策略。
注意std::map
是NOT一个哈希映射;它是一个基于树的映射结构,查找是O(log n)。然而,std::unordered_map
是一个查找是O(1)的哈希映射结构。
相关文章:
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- C++中的并发哈希表
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 调整大小和复制哈希表数组中的元素
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 实现具有浮点键的类似哈希表的数据结构,其中公差内的值被合并在一起
- 通过自定义结构和链接列表类中的C 中的哈希表
- 使用对数据类型的向量的哈希表中的分段错误错误
- 名称和伪ID的数据结构:使用哈希表或bst
- 在光子云上使用哈希表发送数据
- 哈希表(数据结构)
- 索引链表(哈希表中的索引)的C++/STL 结构
- 如何存储需要随机选择和删除的数据,矢量,哈希表或其他
- 在2D哈希表中正确索引数据
- 对于哈希表,通常使用哪些数据结构来保存哈希表
- 哈希表线性探测数据结构
- 非STL哈希表类型结构