【问题标题】:C++ unordered-map good number of bucketsC ++无序映射良好的桶数
【发布时间】:2015-03-16 19:39:53
【问题描述】:

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

我正在考虑使用n = 10*k 在大小和碰撞机会之间进行合理的权衡。

【问题讨论】:

  • std::unordered_map 的实现为您决定,除非您可以证明(通过测量)这远非最佳你的用例。
  • 好吧,std::unordered_map 不知道我要插入多少元素。我认为利用这些知识是可取的。

标签: c++ c++11 hash unordered-map


【解决方案1】:

使用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 的两种主要类型:链接和开放寻址。此描述包含一个nice chart,它显示了这两种基本哈希数据结构设计的平均冲突次数与负载因子。

std::unordered 容器被限制为使用链式设计,因此您可以了解负载因子为 1 时可能发生的碰撞。

委员会的动机是让其容器在大多数情况下都能开箱即用,无需进行大量调整。委员会认为默认的 max_load_factor 为 1 将是内存使用和由于冲突导致的性能下降之间的一个不错的折衷方案。

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

【讨论】:

  • 这导致了一个问题,什么是好的max_load_factor。你认为 1.0 会是可取的吗?从理论上讲,max_load_factor 为 1.0 意味着几乎可以肯定哈希串通,对吧?
猜你喜欢
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多