这是对不同数字排序的更好方法
Which the better way to sort distinct numbers?
在使用STL的c++中,这两种操作中哪一种对不同的大数排序所需的CPU时间更少?
- 将元素推入集合
- 存储元素在一个向量和调用sort()函数?
如果是一次性操作,我会使用std::vector
,然后是std::sort
。
就渐近复杂性而言,这两个解应该是等价的:在一个集合中插入是O(log(n)),你对n个元素这样做,所以它是O(n log(n))(证明)。
另一方面,在向量中插入(前提是你提前知道大小)是O(N),排序是O(N log(N)),所以全局是O(N log(N))。
但是:向量需要一次性分配(或者,如果你不知道最终大小,它应该在典型实现的O(log(N))次重新分配中达到最终大小);另一方面,如果将集合实现为RB树,则需要对每个节点进行分配,这意味着您必须调用分配器N次,而在POD容器中调用分配器可能会成为瓶颈之一。此外,树通常具有较少的缓存局部性,并且使用更多的内存,因此所有这些开销可能会损害性能。
同样,大0符号显示了函数时间依赖性,但隐藏了乘法常数;不要相信我的话,但我几乎可以肯定,N*set插入将比最后的单个排序花费更多,因为每个元素都要做额外的记录(树插入通常需要一些工作来恢复RB树的属性)。
另一方面,如果你必须保持你的数据结构的排序(新数据的到来)通常是正确的解决方案。
但是,像往常一样,当你有疑问时profile。
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 如何使插入排序更快?
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 有没有更好的方法对C++中的三个整数进行排序?
- 从矢量中最快的擦除元素或更好地利用内存(排序基数)
- 改善并行bitonic排序的更好方法
- 更好的做法是在数组中插入值,然后排序,或者在插入时保持排序顺序
- 寻找更好的数据排序方法
- 对 2 个"linked"数组进行排序的更好方法?
- 这是对不同数字排序的更好方法