Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 插入的复杂性_Sorting_C++11_Vector_Insert - Fatal编程技术网

Sorting 插入的复杂性

Sorting 插入的复杂性,sorting,c++11,vector,insert,Sorting,C++11,Vector,Insert,我有一个排序向量, 更好的是: 使用lower_bound并在向量中的位置插入元素。 或者简单地将元素推回到向量中,并在需要时使用sort()对其进行排序?对于执行一次的单个操作,使用下限和插入更便宜下限是O(log(n))和插入将是(最坏和平均情况)O(n),最终复杂性为O(n) 如果在插入向量之后才需要对向量进行排序,那么只排序一次会便宜得多,因为所有的push_s将是O(1)*O(n)=O(n),最后的排序将是O(n*log(n)),最终的复杂度为O(n*log(n)),而多重下限+插入将

我有一个排序向量, 更好的是: 使用lower_bound并在向量中的位置插入元素。
或者简单地将元素推回到向量中,并在需要时使用sort()对其进行排序?

对于执行一次的单个操作,使用
下限
插入
更便宜<代码>下限是
O(log(n))
插入
将是(最坏和平均情况)
O(n)
,最终复杂性为
O(n)

如果在插入向量之后才需要对向量进行排序,那么只排序一次会便宜得多,因为所有的
push_
s将是
O(1)*O(n)=O(n)
,最后的排序将是
O(n*log(n))
,最终的复杂度为
O(n*log(n))
,而多重
下限
+
插入
将使您的复杂性为
O(n)*O(n)=O(n**2)


如果您需要在整个插入过程中对元素进行排序,那么哪个更便宜将在很大程度上取决于您的使用模式(需要对元素进行排序的频率和时间)。通常情况下,您只需要在构建过程结束时对元素进行排序,这就是为什么在构建过程结束时进行排序可以成为工具带中非常强大的工具。如果这不是你的使用模式,你可能想至少考虑使用一个关联的容器,如<代码> MulySub 或 MultIMAP>。

这取决于“需要什么时候”的频繁程度。当需要时,我会进行排序。如果未排序元素的数量与向量的大小相比较小,则对最后一个后推的元素使用插入排序。否则,对最后的元素使用std::sort,然后使用就地合并。我不确定为什么要标记这个问题。除了
C++03
C++98
中的
lower\u-bound
insert
push\u-back
sort
之外,我在这个问题上看不到任何特别相关的东西。其他一切都是通用算法分析。谢谢。在我的例子中,下界和插入可以提供更快的性能。