插入unordered_map需要花费太多时间

时间:2016-10-30 22:35:46

标签: c++ performance stl unordered-map

我写了一个程序,从文件中读取数字(大约500,000个),然后将它们插入到数据结构中。数字是截然不同的。 我正在使用其他结构将数字插入unordered_map(使用std::make_pair(myNumber, emptyStruct))

插入所有数字后,我用它只搜索了几百次。在程序运行完毕之前,我从不删除DS。

分析后,我注意到插入操作占用了大约50%的运行时间。 (还有一些其他代码,与插入一样多次运行,但它不会花费太多时间)。

我想也许调整大小需要时间,所以我使用了500,000的保留功能,但结果仍然相同。

据我所知,这个DS应该是O(1)插入和搜索(并且权衡是大内存),所以我不明白为什么插入需要这么多时间。如何改善我的成绩?

2 个答案:

答案 0 :(得分:1)

无序映射使用哈希表实现。它已经摊销了恒定的插入时间。保留地图的大小有助于,但不是太多。在插入方面你可以做得更好。

这意味着你可能会刮胡子一段时间,但这只会是微不足道的。例如,插入到矢量中的速度稍快一些,但它也会按照常量时间分摊。因此,您将在插入过程中花费几秒钟,但代价是搜索。

这是数据库有用的地方。假设您在sqlite数据库中拥有数据。您创建数据库,创建以搜索值为主键的表,并将数据值作为其他属性,将值插入表中一次。现在,程序只运行并查询数据库。它只读取必要的最低限度。在这种情况下,sqlite数据库将扮演您正在使用的无序映射的角色。

答案 1 :(得分:-1)

由于您没有使用某个值,只是搜索存在,请使用std :: unordered_set。当你创建一个虚拟值来与地图中的每个键一起使用时,它就能做你想要的。

首先,我想重新讨论每个人所说的内容:插入500,000个项目几百次使用它将占用你相当大的一部分时间,而你无法避免这种情况,除非你能够转向它周围 - 构建一组你正在搜索的东西,然后搜索500,000次。

所有这一切,考虑到哈希表的性质,我能够在测试应用中插入500,000个项目得到一些改进:

回顾http://en.cppreference.com/w/cpp/container/unordered_map,我发现了这些:

  

[插入]复杂性:平均情况:O(1),最差情况O(大小())

     

默认情况下,unordered_map容器的max_load_factor为1.0。

当您为500000个项目预留空间时,您将获得500000个桶。如果你在500000个桶中放入500000个数据,那么你将会遇到很多冲突。我预留了额外的空间,而且速度更快。

如果你真的需要速度,并且愿意得到一些错误,请查看布隆过滤器。