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

时间:2015-07-26 21:15:51

标签: c++ algorithm hash hashmap

我理解哈希键的检索被认为是O(1),而密钥又可以指向我们实际的数据。

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

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

2 个答案:

答案 0 :(得分:3)

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

为了在具有相对窄范围的散列桶的数组中存储大范围的散列键,使用模运算符%collision resolution strategy。为了减少冲突次数,将桶的数量设置为素数。这降低了hashCode % bucketCount不均衡地将哈希码引导到存储桶的可能性。

答案 1 :(得分:2)

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

请注意std::map NOT 哈希映射;它是一个基于树的地图结构,查找是O(log n)。但是,std::unordered_map是一个哈希映射结构,其查找为O(1)。

相关问题