如果我知道地图键的预期数量,我应该使用什么 bucket_count 值?
What bucket_count value should I use if I know the intended number of map keys?
我正在创建一个 std::unordered_map
,我将立即着手填充 n 个键值对 - 我知道 n。之后将不再添加元素 - 我将只执行查找。
因此,我应该将什么作为 bucket_count
传递给构造函数?
备注:
- 我知道这不是很重要,我可以简单地不指定任何内容,它会起作用。
- 这与 What should I pass to unordered_map's bucket count argument if I just want to specify a hash function?)
有关,但不是其欺骗
- 如果对您的回答有帮助,您可能会假设我想要一个介于 f_1 和 f_2 之间的负载因子(提前知道)。
- 我使用的是默认的哈希函数,我不知道输入是什么样的,但它不太可能与哈希函数对抗..
根据n4296 in 23.5.4.2 [unord.map.cnstr](这是C++14的最终稿)
默认情况下 unordered_map
的 max_load_factor
是 1.0,因此您可以将 bucket_count 设置为 n
.
显然,在增加桶数以提高速度和减少桶数(并提高最大负载系数)以提高 space 之间存在 space 时间权衡 space。
我要么不担心,要么如果它是 大 地图,请将存储桶计数设置为 n
。然后当分析显示你有问题时,你可以担心优化。
如果您知道所需的负载系数范围,则只需将桶数设置为 std::ceil(n/(std::max(f_1,f_2))
(并在填充地图之前设置负载系数)。
鉴于您的负载系数有一个范围,唯一缺少的信息是碰撞率。您可以简单地使用 nb_buckets = n / f_2
,并且您一定会得到小于或等于 f_2
的负载因子。确保 f_1
的正确性需要有关冲突率的数据。
我正在创建一个 std::unordered_map
,我将立即着手填充 n 个键值对 - 我知道 n。之后将不再添加元素 - 我将只执行查找。
因此,我应该将什么作为 bucket_count
传递给构造函数?
备注:
- 我知道这不是很重要,我可以简单地不指定任何内容,它会起作用。
- 这与 What should I pass to unordered_map's bucket count argument if I just want to specify a hash function?) 有关,但不是其欺骗
- 如果对您的回答有帮助,您可能会假设我想要一个介于 f_1 和 f_2 之间的负载因子(提前知道)。
- 我使用的是默认的哈希函数,我不知道输入是什么样的,但它不太可能与哈希函数对抗..
根据n4296 in 23.5.4.2 [unord.map.cnstr](这是C++14的最终稿)
默认情况下 unordered_map
的 max_load_factor
是 1.0,因此您可以将 bucket_count 设置为 n
.
显然,在增加桶数以提高速度和减少桶数(并提高最大负载系数)以提高 space 之间存在 space 时间权衡 space。
我要么不担心,要么如果它是 大 地图,请将存储桶计数设置为 n
。然后当分析显示你有问题时,你可以担心优化。
如果您知道所需的负载系数范围,则只需将桶数设置为 std::ceil(n/(std::max(f_1,f_2))
(并在填充地图之前设置负载系数)。
鉴于您的负载系数有一个范围,唯一缺少的信息是碰撞率。您可以简单地使用 nb_buckets = n / f_2
,并且您一定会得到小于或等于 f_2
的负载因子。确保 f_1
的正确性需要有关冲突率的数据。