C++ 加快地图速度的最快方法<;字符串,int>。在c++。钥匙是按字母顺序排列的
我有一张大约100000双的地图。如果键是按字母顺序排列的,那么在使用find()时是否有任何方法可以加快搜索速度。还有,我该怎么做呢。我知道你可以在创建地图时指定一个新的比较器。但是这会加快find()函数的速度吗 提前谢谢 [已解决]感谢一群家伙,我决定使用向量,并使用上下限来“剪断”一些搜索C++ 加快地图速度的最快方法<;字符串,int>。在c++。钥匙是按字母顺序排列的,c++,map,C++,Map,我有一张大约100000双的地图。如果键是按字母顺序排列的,那么在使用find()时是否有任何方法可以加快搜索速度。还有,我该怎么做呢。我知道你可以在创建地图时指定一个新的比较器。但是这会加快find()函数的速度吗 提前谢谢 [已解决]感谢一群家伙,我决定使用向量,并使用上下限来“剪断”一些搜索 另外,我是新来的。有没有办法将这个问题标记为已回答,或者选择一个最佳答案?std::map已经利用了键按字母顺序排列的事实,它保证了这一点。您无法通过更改比较器来改进它(假设它已经是一个相当有效的字符
另外,我是新来的。有没有办法将这个问题标记为已回答,或者选择一个最佳答案?
std::map
已经利用了键按字母顺序排列的事实,它保证了这一点。您无法通过更改比较器来改进它(假设它已经是一个相当有效的字符串比较)
您是否考虑过在C++11之前的各种实现中使用unordered_map
(akahash_map
)?它应该能够在O(1)中而不是O(log(n))中搜索std::map
你也可以研究一些更奇特的东西,比如trie,但这不是标准库的一部分,所以你要么在别处找到一个,要么自己动手,所以我建议
unordered\u map
是一个很好的起点。如果一个不同的比较器能够更快地进行比较,那么它只能加快查找速度(对于字符串来说,这通常是相当困难的)
如果基本上是按顺序插入所有数据,然后进行搜索,那么使用std::vector
和std::lower_bound
或std::upper_bound
可能会更快
如果您并不真正关心排序,只想尽快找到数据,您可能会发现std::unordered_map
更适合您
编辑:仅供记录:您“可能找到”或“可能找到”这些东西的方式通常是通过分析。根据情况,分析速度可能足够快,即使在简单的测试中也很明显,因此分析不是真的必要,但如果有(很多)怀疑,或者你想量化效果,探查器可能是正确的方法。我投票支持
无序地图
,但我想提出另一点
在现代机器上,影响性能的一个因素是缓存使用不当。映射将在所有位置分配节点,并且没有太多的引用位置。此外,由于它必须在节点之间存储一组指针,因此会占用更多内存
在最近的一次会议上,比亚恩·斯特劳斯特鲁(Bjarne Stroustroup)给出了一个关于这个主题的演讲。他比较了vector
和list
在一项涉及大量随机插入和删除的任务中的性能,在这项任务中,似乎list
应该占主导地位,但由于内存大小和布局问题,vector
被我忽略了事实上是目前为止最快的。请看,从幻灯片43开始
unordered\u map
允许您直接访问元素,因此它可能意味着在内存中跳跃的次数比尝试将数据粘贴到向量中的次数更少(因此性能优于向量
)因此,我的评论只是一个警告,要时刻牢记内存访问模式以提高性能如果您使用std::find
查找元素,您应该切换到使用map::find
(您的问题中并没有真正的说明)。map::find
使用这样一个事实,即映射的顺序是为了更快地搜索
如果这还不够好,您可以查看散列容器,例如unordered_-map
,而不是map
,如果您的编译器支持它,请尝试std::unordered_-map
。另外,按字母顺序排列键并不重要,map
无论如何都会将它们重新排列为字母顺序。@MarkRansom:就因为我不同意:这取决于比较器:d要将问题标记为已回答,你可以在答案的左侧,投票按钮下面用勾号选择一个最佳答案。关于排序的std::vector
,请参阅“s”,以获得一个预写、预测试的实现。@JerryCoffin:我删除了下一票。我删除了下一票有一种令人不快的倾向。这是一个很好的观点。问题真的没有弄清楚。使用std::find
基本上是搜索的最坏情况,无论是在算法上还是在内存访问模式方面。实际上,如果用于std::find
的比较器与用于映射或是的,无法std::find
专门使用memberfind
?@bames53否,因为std::find
无法通过或不知道容器是什么。它只是进行线性搜索。@bames53:可以,但不需要,而且我从未见过实现这样做,因为它远比听起来难。@MarkB这是有道理的。尽管我认为如果迭代器提供对容器的访问(就像调试迭代器用于有效性检查)就可以做到这一点。显然,依赖一个实现来实现这一点是不好的,因此首先不值得实现,除非是出于好奇。我喜欢他在演讲期间绘制的速度比较图。局部性很好,但只适用于线性内容。向量上的二进制搜索可能比地图慢。我想知道a是否会快比排序数组好吗?@MooingDuck幻灯片上确实有图表:)@MooingDuck为什么对向量
的二进制搜索要比搜索映射
慢?在这两种情况下,您都会在内存中四处跳跃,直到在向量
情况下,范围缩小到适合缓存线的位置。除非所有映射
节点一起分配