在向量与集合中搜索性能

时间:2014-06-30 07:12:48

标签: c++ vector set

在阅读了以下几个问题和答案之后:

  

在集合中查找比在向量中渐近更快。 (因为一个集合基本上是一个二叉搜索树)。对于手头的任务,set比vector更快,因为它保持其内容排序并进行二进制搜索以找到指定的项目,给出对数复杂度而不是线性复杂度。

我的问题是 - 将使用二进制搜索在排序向量中搜索元素与搜索集合中的元素同时进行搜索吗?如果没有,那么性能差异背后的原因是什么?

3 个答案:

答案 0 :(得分:3)

我认为您不太可能看到很多性能差异。

我已经在Stack Overflow上看到了其他与性能相关的问题。现在有很多非常好的材料出现在标准容器的性能上,特别是我们现在在硬件中获得的缓存的速度和大小。

这是一段视频,其中Herb Sutter详细介绍了std::vector的表现; http://channel9.msdn.com/Events/Build/2014/2-661 Herb Sutter在23:30左右用非常好的图表,图表,解释等详细介绍了一些细节,他在46:00左右拿起了Bjarne的材料。

答案 1 :(得分:3)

如果您可以对矢量进行排序,并使用std::lower_bound, 两者的搜索均为O(lg(n))。随着警告 std::vector享有更好的地方,等等 机器,将具有显着较低的常数因子。它 由于较少,也可能导致更有效的内存使用 碎片 - 如果你知道的话,尤其如此 预先最大尺寸,可以使用std::vector<>::reserve

答案 2 :(得分:2)

两者将具有相同的渐近性能,因为在集合中需要O(log(n))时间,并且当向量被排序并且使用二进制搜索搜索元素时 - 时间复杂度将再次为O(log(n) ))。