【发布时间】: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 接管的地方,然后效率更高,至少这就是到目前为止我已经收集了。这样做很糟糕,故意给数据结构带来压力。