【问题标题】:Which is more efficient, set or vector哪个更有效,集合还是向量
【发布时间】:2015-07-27 19:48:18
【问题描述】:

我有一点问题,最近有人告诉我,对于输入的无序值,一堆随机值,比如说 100 万个,使用集合比使用向量更有效,然后用基本的排序算法函数对所述向量进行排序,但是当我使用它们并通过时间函数检查它们时,在终端和 valgrind 中,它表明向量的时间复杂度和空间使用都更快,即使添加了调用的排序函数。给我建议使用该套件的人在 C++ 语言方面比我更有经验,但在接受人们的建议之前,我总是必须自己测试一下。测试代码如下。

套装

std::set<int> testSet;
  for(int i(0); i<= 1000000; ++i)
    testSet.insert(-i);

对于矢量

 std::vector<int> testVector;
  for(int i(0); i<= 1000000; ++i)
    testVector.push_back(i * -1);

  std::sort(testVector.begin(), testVector.end());

我知道这些不是随机变量,这是不公平的,因为 set 不允许重复,而 vector 确实对于这个基本功能点来说它们的大小不同。任何人都可以澄清为什么应该使用该集合,没有重复的点。

我也没有对无序集进行任何测试。不太确定两个给定点之间的差异。

【问题讨论】:

  • 它们的语义是正交的,比如要求行为的效率是。首先为您的用例定义效率
  • 还请注意,您插入的方式非常低效。在不保留内存的情况下进行相同插入的奇偶校验时,由于底层数据结构的原因,vector 通常会优于 set,这对于前者来说很简单。
  • 是的,与向量所需的 18 个相比,我看到了在集合数据结构中发生的大量空闲和分配,因为它的大小只是翻了一番,并留下了很多其尾迹可能会或可能不会被使用的空白空间。这只是我试图在插入时尽可能低效,但没有搜索,这可能是这个复杂性检查本身所缺少的,我认为 set 接管的地方,然后效率更高,至少这就是到目前为止我已经收集了。这样做很糟糕,故意给数据结构带来压力。

标签: c++ vector set


【解决方案1】:

这太模糊了,忽略/错过了几个关键因素。如果您的朋友正是这样说的,那么您的朋友(无论他或她的经验如何)都是错误的。更有可能你在某种程度上误解了他们的话,并把事情的简化版本解读为他们。

当您想要一个排序的最终产品时,当您插入一个集合时,排序是“摊销”的,因为您每次都会得到一点点排序操作。如果您将定期多次插入,那么分散工作量可能就是您想要的。总数加起来可能仍然超过向量(考虑偶尔的重新平衡等;您的向量只需要不时移动到更大的内存块),但是您已经将其分散了以免明显减慢程序的某些其他部分。

但是,如果您只是将所有元素转储到一个向量中并立即排序,那么不仅容器和算法要做的工作更少,而且您可能不介意它花费大量时间。

您还没有真正详细说明您的用例,所以我不会假装在这里给出具体细节,但是对您提出的问题的唯一可能答案是“它取决于”和“这个问题从根本上来说有点毫无意义";您不能只采用两种数据结构和排序方法,然后问“哪个更有效?”没有用例。但是,您已经正确测量了时间和空间要求,如果您根据实际用例做到了这一点,那么,您有答案了,不是吗?

【讨论】:

  • stackoverflow.com/questions/8686725/… 这或多或少是我要问的,他们详细介绍了事情的完成方式、时间复杂度和排序点,以及为什么一种方式更多或比另一个差。主要的是,当涉及到被问到的问题时,很多人都相当挑剔。您还回答了我的问题,我正在寻找但不太确定它们是否与我猜想的不同。如果这对其他人有帮助,那么我没有任何问题。
  • 嗯,这是相关的,但我不会称之为重复。
猜你喜欢
  • 2011-11-08
  • 2013-04-12
  • 2012-02-12
  • 2022-01-02
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2021-11-25
相关资源
最近更新 更多