C++ 无序映射好数量的桶

C++ unordered-map good number of buckets

我知道在构建无序映射 M 时,我将准确插入 k 个元素。我应该如何选择 M 的 Bucket 数量?

我正在考虑使用 n = 10*k 在大小和碰撞几率之间取得合理的权衡。

使用k == n是个不错的选择。无序容器的默认 max_load_factor 是 1.0。这意味着容器在 k > n 之前不会重新分配更多的桶。如果你想要另一个 max_load_factor,那么构建你的容器,设置 max_load_factor,然后调用 reserve(k),这将为 k 元素分配足够的桶,你当前的 max_load_factor.

选择好的 max_load_factor 取决于所使用的散列数据结构的类型。 Here is a good description of two major types: chaining and open addressing. This description contains a nice chart 这显示了这两种基本哈希数据结构设计的平均冲突次数与负载因子。

std::unordered 容器被限制为使用链接设计,因此您可以感受一下负载因子为 1 时预期的碰撞。

委员会有动力让它的容器在大多数情况下开箱即用,不需要进行大量调整。委员会认为默认值 max_load_factor 为 1 是内存使用和由于冲突导致的性能下降之间的妥协。

如果您不确定,让容器默认。如果您好奇,请更改默认值并测量(速度和内存使用情况)。