要将一个元素放入一个无序集合中,我们计算它的散列并将其放入相应的桶中。但是,我们通常比散列函数的值范围少得多的桶。如何计算桶和哈希值的对应关系?似乎使用了一些函数反映(0 ... size_t) - > (0 ... size_of_buckets - 1)。但是使用这样的函数可能会导致大量的冲突,即使是好的散列函数也是如此。
答案 0 :(得分:3)
我不确定标准中是否定义了std::unordered_map
确切行为。但是,基本原则是:始终保持桶的数量大于容器的大小乘以一个小数字(这个小数字是1.0 / load_factor)。这样,碰撞应该很少见。
对于哈希表,通常有两种方法来计算bucket_index:
对于方法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