C 合并向量非常快
我想非常快地合并数值向量。我在一本书中发现,合并大小为n1和n2的两个向量,需要与n1+n2成比例的时间。那么合并大小为n1,n2,n3的三个向量,顺序重要吗?如果是,为什么 编辑:C 合并向量非常快,c,C,我想非常快地合并数值向量。我在一本书中发现,合并大小为n1和n2的两个向量,需要与n1+n2成比例的时间。那么合并大小为n1,n2,n3的三个向量,顺序重要吗?如果是,为什么 编辑: 是的,向量是按顺序排列的,结果必须按顺序排列。在泛型情况下合并两个排序的数组需要n1和n2中较小的一个,以及与n1+n2-1比较和n1+n2移动的总和 您可以以很少的成本优化特殊情况,例如一个数组中的所有值都低于另一个数组中的所有值的情况。这样做可以显著提高排序和反向排序数组的mergesort性能 如果其中一个数
是的,向量是按顺序排列的,结果必须按顺序排列。在泛型情况下合并两个排序的数组需要
n1
和n2
中较小的一个,以及与n1+n2-1
比较和n1+n2
移动的总和
您可以以很少的成本优化特殊情况,例如一个数组中的所有值都低于另一个数组中的所有值的情况。这样做可以显著提高排序和反向排序数组的mergesort
性能
如果其中一个数组明显小于另一个,则较大数组中较小数组的二进制搜索元素将显著减少比较的数量,并允许块将元素从较大数组移动到目标
仔细实现合并代码将避免不必要地测试数组边界
下面是一些代码:
static void merge(int *dest, const int *a1, size_t n1, const int *a2, size_t n2) {
if (n1 == 0 || n2 == 0 || a1[n1 - 1] <= a2[0]) {
/* trivial cases and arrays in order */
memcpy(dest, a1, n1 * sizeof(int));
memcpy(dest + n1, a2, n2 * sizeof(int));
return;
}
if (a2[n2 - 1] < a1[0]) {
/* arrays should be swapped */
memcpy(dest, a2, n2 * sizeof(int));
memcpy(dest + n2, a1, n1 * sizeof(int));
return;
}
/* general case */
for (const int *e1 = a1 + n1, *e2 = a2 + n2;;) {
if (*a1 <= *a2) {
*dest++ = *a1++;
if (a1 >= e1) {
memcpy(dest, a2, (e2 - a2) * sizeof(int));
break;
}
} else {
*dest++ = *a2++;
if (a2 >= e2) {
memcpy(dest, a1, (e1 - a1) * sizeof(int));
break;
}
}
}
}
静态无效合并(int*dest,const int*a1,大小为n1,const int*a2,大小为n2){
如果(n1==0 | | n2==0 | | a1[n1-1]=e2){
memcpy(dest,a1,(e1-a1)*sizeof(int));
打破
}
}
}
}
你的问题不清楚,你能澄清一下吗?你从来没有提到原始向量或结果合并是否已排序,以及是否要保持排序(不管是什么)。@WhozCraig抱歉,我添加了信息为什么这个问题被标记为C
?这实际上是一个一般的计算机科学问题(复杂性-大O)。。。