操作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)或排序单个向量。我只对这两个操作的执行速度感兴趣。
由于
答案 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
数组,甚至不需要排序; - )