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 是内存使用和由于冲突导致的性能下降之间的妥协。
如果您不确定,让容器默认。如果您好奇,请更改默认值并测量(速度和内存使用情况)。
我知道在构建无序映射 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 是内存使用和由于冲突导致的性能下降之间的妥协。
如果您不确定,让容器默认。如果您好奇,请更改默认值并测量(速度和内存使用情况)。