性能:用N /​​ m elems排序'm'向量Vs用N个元素排序单个向量

时间:2010-02-19 11:48:00

标签: c++ performance

操作A

我有N个向量,每个向量包含一定数量的唯一3D点。例如:std::vector<double*> vec1;和那样的

我正在对每个向量执行排序操作,如:

 std::sort(vec1.begin(), vec1.end(), sortCriteria());
 std::sort(vec2.begin(), vec2.end(), sortCriteria());
 std::sort(vec3.begin(), vec3.end(), sortCriteria());

操作B

假设我有一个名为“all_point_vector”的向量,它保存来自vec1,vec2,vec3的3D点......

即。 all_point_vector中的3D点= points_in_vec1 + .... + points_in_vector3。

我正在执行排序操作:

std::sort(all_point_vec.begin(), all_point_vec.end(), sortCriteria());

我的问题是,上述哪种方法(手术A或B)一般会更快?排序单个向量(all_point_vector)或排序单个向量。我只对这两个操作的执行速度感兴趣。

由于

3 个答案:

答案 0 :(得分:4)

排序是O(n log n)操作。使用N元素对m/N向量进行排序将比在m增加m元素的单个向量排序时更快。

对于任何固定的m哪一个更快,只能通过分析来确定。

答案 1 :(得分:3)

什么 avakar 说,理论上排序一些短向量应该比整体排序更快,在实践中 - 你应该测量。我想展示一些更多的数学:

k 序列和 i -th序列具有 n i 元素数量。设元素总数为 N = n 1 + ... + n k 。对单个序列进行排序具有复杂度O(n 1 logn 1 + ... + n k logn k ) 。对大序列进行排序具有复杂度O(N logN)= O((n 1 + ... + n k )logN)= O(n 1 < / sub> logN + ... + n k logN)。现在我们要比较

A = n 1 logn 1 + ... + n k logn k

B = n 1 logN + ... + n k logN

由于N> n i 表示所有 i ,logN&gt;所有 i 的登录 i 。因此,B严格大于A,即对整个序列进行排序将花费更多时间。

答案 2 :(得分:1)

对单个m元素数组进行排序与​​分类为N数组的相同数量的元素排序是一个不同的问题,因为在分案中,您仍然没有总订单所有元素。

假设m = 1024,在单例情况下,m log m = 1024 * 10 = 10240。

如果N=2你有512 * 9 + 512 * 9 = 9216,但你仍需要进行1024次比较的合并步骤,而9216 + 1024 = 10240,那么它是相同的。

[实际上,在排序的每个级别,比较次数比要合并的项目数少1,但总体结果仍为O(n log n)]

ADDED:如果你评论说,你不需要进行合并,那么分案就更快了。 (当然,在这种情况下,您可以将m项划分为N=m数组,甚至不需要排序; - )