在这种情况下比较 std::vector 或 std::set 以获得时间复杂度 - 更有效率

Comparing std::vector or std::set in this case for time complexity - More efficent?

本文关键字:std 时间复杂度 有效率 set 比较 这种情况下 vector      更新时间:2023-10-16

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

我的第一个想法是使用向量(即(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是摊销常量,如果向量没有排序(这里不是(,std::find 将是 O(n(。我的假设是否正确,为了获得最大效率,我应该在这里使用一组?我可能错过了什么吗?

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

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

以最优雅和可维护的方式编写代码,使用易于理解的算法和自然适合设计的容器(需要排序的集合和映射,一般存储的向量,无序集合和映射(如果顺序不重要且数据集很大(。如果您需要对同一数据进行多个有序索引,那么可能是一个用于存储的向量,其中包含用于索引的迭代器/指针集(如数据库(。

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

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

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

基本上只有 3 种类型 - 您可以通过反复试验找到最佳解决方案,时间比争论它所需的时间更短。

:-(