首页 文章

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

提问于
浏览
0

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

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

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

1 - 使用std :: find检查向量中是否存在项目

std::find(vector.begin(), vector.end(), item)!=vector.end()

2 - 如果项目不存在,则执行push_back(Amortized constant)并对其执行操作,否则忽略该字符串

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

1 - 如果不插入,检查插入功能是否存在于集合中

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

    }

插入集合的时间复杂度为 O(logn) . 向量的push_back是Amortized常量,如果向量是't sorted(in this it isn't,则std :: find将是O(n) . 我的假设是否正确,为了获得最大效率,我应该在这里使用一套?有什么我可能会失踪的吗?

1 回答

  • 1

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

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

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

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

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

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

    从根本上只有3种类型 - 您可以通过反复试验找到最佳解决方案,花费的时间少于争论它 .

    :-)

相关问题