【问题标题】:What bucket_count value should I use if I know the intended number of map keys?如果我知道映射键的预期数量,我应该使用什么 bucket_count 值?
【发布时间】:2016-12-16 10:46:20
【问题描述】:

我正在创建一个std::unordered_map,我将立即使用 n 个键值对填充它 - 我知道 n。之后将不再添加任何元素 - 我只会执行查找。

因此,我应该将什么作为 bucket_count 传递给构造函数?

注意事项:

【问题讨论】:

  • 这在很大程度上取决于您之后将如何处理此地图。你会添加其他元素,还是只是阅读它?您追求速度还是空间效率?您的哈希函数在您的集合上产生了多少冲突?考虑负载因子而不是实际的桶数是合理的。
  • @Jean-BernardJansen:见编辑。另外,我想要某种合理的默认值——就像我们现在在不知道 n 的情况下有一个合理的默认值一样。添加该信息并应用相同的考虑因素,应该会产生一些数字...

标签: c++ unordered-map c++-standard-library buckets


【解决方案1】:

根据n4296 in 23.5.4.2 [unord.map.cnstr](这是C++14的最终稿) 默认情况下,max_load_factorunordered_map 为 1.0,因此您只需将 bucket_count 设置为 n

在增加桶数以提高速度和减少桶数(并提高最大负载因子)以改善空间之间显然存在时空权衡。

我不会担心它,或者如果它是一个 地图,请将桶数设置为 n。然后,您可以在分析显示您有问题时担心优化。

如果您知道所需的负载因子范围,那么您只需将桶数设置为std::ceil(n/(std::max(f_1,f_2)),(并在填充地图之前设置负载因子)。

【讨论】:

    【解决方案2】:

    鉴于您的负载系数有一个范围,唯一缺少的信息是碰撞率。您可以简单地使用nb_buckets = n / f_2,并且您一定会获得小于或等于f_2 的负载因子。确保f_1 的正确性需要有关冲突率的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多