hashmap一般用什么数据结构hold to hash table
What data structures are generally used hold to hash table for a hashmap
我知道检索哈希键的复杂度为 O(1),而键又可以将我们指向实际数据。
我不明白的是,对于任意数量的可能哈希值,我们通常如何存储哈希值。在我看来,这本身应该是一个允许稀疏值支持键值对的数据结构,例如 std::map 并且不能用 std:vector.
来完成
我想在这里说的是,如果你有一个 32 位的 hasCode,当几乎所有行都指向 NULL 时,你不可能从一开始就保留那个大小的数组,因为可能没有足够的数据。
一个散列table结构是一个数组结构,但不是,它没有那么多条目;相反,一个人使用数组大小的模数运算来确定位置。这种取模操作(除了散列的有限大小和多个值可能产生相同散列的事实之外)是必须处理冲突的原因之一。不同类型的哈希映射以不同方式处理冲突;流行的解决方案包括在每个条目处添加一个 linked 列表("chained" 方法)或执行二次哈希并遍历数组以找到一个空位("open addressing" 方法); dasblinkenlight 的 link.
中指出存在其他策略
请注意 std::map
是 不是 哈希映射;它是一个基于树的映射结构,查找是 O(log n)。但是,std::unordered_map
是一个哈希映射结构,其查找为 O(1)。
散列键通常存储在数组或其他支持 O(1) 随机访问其元素的结构中。随着向散列中添加更多元素,结构的大小会增加 table。发生这种情况时,每个键值对通常会重新散列。
为了将范围较广的散列键存储在具有相对较窄范围的散列桶的数组中,模运算符%
和collision resolution strategy 用来。为了减少碰撞次数,桶的数量设置为质数。这减少了 hashCode % bucketCount
将哈希码不均匀地引导到桶的可能性。
我知道检索哈希键的复杂度为 O(1),而键又可以将我们指向实际数据。
我不明白的是,对于任意数量的可能哈希值,我们通常如何存储哈希值。在我看来,这本身应该是一个允许稀疏值支持键值对的数据结构,例如 std::map 并且不能用 std:vector.
来完成我想在这里说的是,如果你有一个 32 位的 hasCode,当几乎所有行都指向 NULL 时,你不可能从一开始就保留那个大小的数组,因为可能没有足够的数据。
一个散列table结构是一个数组结构,但不是,它没有那么多条目;相反,一个人使用数组大小的模数运算来确定位置。这种取模操作(除了散列的有限大小和多个值可能产生相同散列的事实之外)是必须处理冲突的原因之一。不同类型的哈希映射以不同方式处理冲突;流行的解决方案包括在每个条目处添加一个 linked 列表("chained" 方法)或执行二次哈希并遍历数组以找到一个空位("open addressing" 方法); dasblinkenlight 的 link.
中指出存在其他策略请注意 std::map
是 不是 哈希映射;它是一个基于树的映射结构,查找是 O(log n)。但是,std::unordered_map
是一个哈希映射结构,其查找为 O(1)。
散列键通常存储在数组或其他支持 O(1) 随机访问其元素的结构中。随着向散列中添加更多元素,结构的大小会增加 table。发生这种情况时,每个键值对通常会重新散列。
为了将范围较广的散列键存储在具有相对较窄范围的散列桶的数组中,模运算符%
和collision resolution strategy 用来。为了减少碰撞次数,桶的数量设置为质数。这减少了 hashCode % bucketCount
将哈希码不均匀地引导到桶的可能性。