插入的复杂性

时间:2014-04-25 11:52:59

标签: sorting c++11 vector insert

我有一个排序的矢量, 什么是更好的: 使用lower_bound并将元素插入向量中的位置。 或者只是将元素push_back转换为vector,并在sort()?

需要时对其进行排序

1 个答案:

答案 0 :(得分:1)

对于执行一次的单个操作,使用lower_boundinsert会更便宜。 lower_boundO(log(n))insert为(最差和平均情况)O(n),最终复杂度为O(n)

如果您在插入之前不需要对矢量进行排序,那么仅排序一次会更便宜,因为所有push_back都是O(1)*O(n) = O(n)并且最终排序为O(n*log(n)),最终复杂度为O(n*log(n)),而多个lower_bound + insert会使您的复杂度为O(n)*O(n) = O(n**2)

如果您需要在整个插入过程中排序的元素,哪一个更便宜将在很大程度上取决于您的使用模式(您需要多长时间以及何时需要对元素进行排序)。通常情况下,您只需要在构造过程结束时排序的元素,这就是为什么最后的排序可以是工具带中非常强大的工具。如果这不是您的使用模式,您可能希望至少考虑使用关联容器,例如multi_setmulti_map