其他分享
首页 > 其他分享> > c – 构建大型(ish)无序集合,并在开头提供所有可用数据

c – 构建大型(ish)无序集合,并在开头提供所有可用数据

作者:互联网

我有一种情况需要优化无序集的创建.预期的元素数量约为5-25M.我的第一个想法是,我应事先准备好所有数据并做类似的事情

unordered_set s(data); 

代替

for (auto& elem : data)
    s.insert(elem); 

STL无序集可以使用批量加载方法并加速其创建吗?如果我在表格构造之前知道预期的元素数量,我该如何调整哈希表的参数(桶大小等)?

解决方法:

My focus now is on whether I can use functions like rehash to notify the table for the upcoming size

假设你打电话

unordered_set s(begin(data), end(data)); 

虽然标准没有规定实现,但是良好的实现将能够辨别元素的数量,并相应地预先分配大小.例如,如果你查看gcc使用的源代码(由我/usr/include / c /5/tr1/hashtable.h),它会使用它

 _M_bucket_count = std::max(_M_rehash_policy._M_next_bkt(__bucket_hint),
                _M_rehash_policy.
                _M_bkt_for_elements(__detail::
                            __distance_fw(__f,
                                  __l)));
 _M_buckets = _M_allocate_buckets(_M_bucket_count);

所以它已经根据元素的数量预先分配了大小.

但问题可能不同.如果你看一下the documentation,它说:

constructs the container with the contents of the range [first, last). Sets max_load_factor() to 1.0.

这样可以节省空间,但可能会导致冲突.为了减少碰撞,你可以使用

unordered_set s(begin(data), end(data), k * data.size()); 

其中k> 1是一些常数.这对应于1 / k的负载系数.因人而异.

标签:unordered-set,c,c-standard-library
来源: https://codeday.me/bug/20190727/1551833.html