ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-27 08:08:33  阅读:219  来源: 互联网

标签:unordered-set c c-standard-library


我有一种情况需要优化无序集的创建.预期的元素数量约为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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有