在这种情况下比较std :: vector或std :: set的时间复杂度 - 更高效?

时间:2014-12-02 23:25:16

标签: c++ vector stl set

我目前有一个返回字符串的函数。我需要跟踪这些返回的字符串,如果没有对返回的字符串执行操作,那么我必须对其执行操作。

我的第一个想法是使用矢量(即)std :: vector。

这是利用矢量的机制看起来像什么

1 - 使用std :: find

检查向量中是否存在项目
std::find(vector.begin(), vector.end(), item)!=vector.end()

2 - 如果项目不存在则执行push_back(摊销常数) 并对其执行操作,否则忽略字符串

我的第二个想法是使用std :: set

1 - 通过执行插入功能检查项目是否存在 如果没有插入

 if(set.insert(somestring).second)
    {
      //Item inserted in set and it did not exist

    }

集合中插入的时间复杂度为O(logn)。向量的push_back是Amortized常量,如果向量没有排序(在这里它不是),std :: find将是O(n)。我的假设是否正确,为了获得最大效率,我应该在这里使用一套?有什么我可能会失踪的吗?

1 个答案:

答案 0 :(得分:1)

我曾经在银行的外汇定价系统工作。表演对我们非常感兴趣。我们曾经对最佳算法进行了长时间的讨论......然后有一天我们用分析工具测量了性能......我们发现实际算法占用了5%的处理时间。当系统接收到消息总线并从消息总线发送消息时,剩下的95%用于将字符串转换为双精度数和双精度数字。

为什么要写这个?只是为了说明在几乎所有情况下,容器的选择可能都是无关紧要的。您的程序不太可能花费超过一小部分时间在地图,集合或向量中查找项目。

使用易于理解的算法以及自然适合设计的容器(用于一般存储的向量,一般存储的向量,无序集和映射,如果使用容易理解的算法)以最优雅和可维护的方式编写代码订单并不重要,您的数据集很大)。如果你需要在同一数据上有多个有序索引,那么可能是一个用于存储的向量,带有用于索引的迭代器/指针集(如数据库)。

然后,当它完成时,如果你的用户尖叫你太慢了(他们不会 - 他们更关心它可靠地工作),描述代码并测量瓶颈。它们几乎总是在I / O中。

如果在极不可能的情况下,您的代码花费90%的时间来管理数据集合,那么是时候重新考虑算法,因为设计可能效率低下 - 或者您正在编写蛋白质折叠模拟器。

如果您确定设计是最佳的,那么可能是时候重新考虑容器的类型了。

基本上只有3种类型 - 您可以通过反复试验找到最佳解决方案,而不是争论它。

: - )