散列函数到无序容器的桶大小?

时间:2017-06-21 06:47:22

标签: c++ unordered

要将一个元素放入一个无序集合中,我们计算它的散列并将其放入相应的桶中。但是,我们通常比散列函数的值范围少得多的桶。如何计算桶和哈希值的对应关系?似乎使用了一些函数反映(0 ... size_t) - > (0 ... size_of_buckets - 1)。但是使用这样的函数可能会导致大量的冲突,即使是好的散列函数也是如此。

2 个答案:

答案 0 :(得分:3)

我不确定标准中是否定义了std::unordered_map确切行为。但是,基本原则是:始终保持桶的数量大于容器的大小乘以一个小数字(这个小数字是1.0 / load_factor)。这样,碰撞应该很少见。

对于哈希表,通常有两种方法来计算bucket_index:

  1. 桶的数量被选择为2的幂:计算散列,然后通过位操作提取其一些较低/较高位。这种方法需要一个好的"散列函数,其中每个位都是随机的
  2. 将桶数选择为素数:计算散列,然后使用模运算,计算bucket_index。这种方法并不需要太好的"哈希函数
  3. 对于方法1.,如果散列函数质量差,则可能会发生很多冲突。对于方法2.即使使用质量不太好的散列函数,通常也很少发生冲突。但是,方法1通常更快,因为位操作比mod快得多(但有一些技术可以使它faster),并且一个足够好的质量哈希函数通常很便宜。

答案 1 :(得分:0)

许多哈希表都是通用的,以便支持许多不同的哈希函数,因此大多数哈希表都没有"计算"散列函数的范围与桶的数量之间的对应关系。

但是桶的数量取决于哈希表的内部结构(冲突解决技术等),尤其是这个名为load factor的值,并且当达到负载因子限制时,实现通常会增加根据预定的常数因子的桶数。

您应该更多地了解std::unordered_map界面并使用以下功能来了解更多信息

http://en.cppreference.com/w/cpp/container/unordered_map/max_bucket_count http://en.cppreference.com/w/cpp/container/unordered_map/bucket_count http://en.cppreference.com/w/cpp/container/unordered_map/bucket_size http://en.cppreference.com/w/cpp/container/unordered_map/max_load_factor http://en.cppreference.com/w/cpp/container/unordered_map/load_factor