这是对不同数字排序的更好方法

Which the better way to sort distinct numbers?

本文关键字:排序 更好 方法 数字      更新时间:2023-10-16

在使用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