Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
C++ 求两个大小不同的排序数组的中值_C++_Arrays_Algorithm - Fatal编程技术网

C++ 求两个大小不同的排序数组的中值

C++ 求两个大小不同的排序数组的中值,c++,arrays,algorithm,C++,Arrays,Algorithm,我正在解决这个问题 在这里,我基本上有三个疑问: 对于N==1且M为奇数的情况 难道我们不能直接找到MO4(A[0],B[M/2],B[M/2-1],B[M/2+1]) 为什么我们要通过idxA来缩短数组A和B 这个算法的时间复杂度是多少 //C++程序 //求两个大小不等的排序数组的中值 #包括 使用名称空间std; //求两个整数中值的效用函数 浮动MO2(内部a、内部b) {return(a+b)/2.0;} //求三个整数中值的效用函数 浮动MO3(内部a、内部b、内部c) { 返回a

我正在解决这个问题

在这里,我基本上有三个疑问:

  • 对于
    N==1且M为奇数的情况

    难道我们不能直接找到
    MO4(A[0],B[M/2],B[M/2-1],B[M/2+1])
  • 为什么我们要通过
    idxA
    来缩短数组
    A
    B
  • 这个算法的时间复杂度是多少
  • <代码> //C++程序 //求两个大小不等的排序数组的中值 #包括 使用名称空间std; //求两个整数中值的效用函数 浮动MO2(内部a、内部b) {return(a+b)/2.0;} //求三个整数中值的效用函数 浮动MO3(内部a、内部b、内部c) { 返回a+b+c-最大值(a,最大值(b,c)) -min(a,min(b,c)); } //求四个整数中值的效用函数 浮点MO4(整数a、整数b、整数c、整数d) { int Max=Max(a,Max(b,Max(c,d)); int Min=Min(a,Min(b,Min(c,d)); 回报率(a+b+c+d-最大-最小)/2.0; } //求单个数组中值的效用函数 浮点中间单(整数arr[],整数n) { 如果(n==0) 返回-1; 如果(n%2==0) 返回(arr[n/2]+arr[n/2-1])/2; 返回arr[n/2]; } //此函数假定N小于或等于M //如果两个数组都为空,则此函数返回-1 浮点FindMediaUtil(整数A[],整数N,整数B[],整数M) { //如果较小的数组为空,则从第二个数组返回中值 如果(N==0) 返回中间单体(B,M); //如果较小的数组只有一个元素 如果(N==1) { //情况1:如果较大的数组也有一个元素, //只需调用MO2() 如果(M==1) 返回MO2(A[0],B[0]); //情况2:如果较大的数组具有奇数个元素, /然后考虑较大数组的中间3个元素 //并且是更小数组的唯一元素。 //举几个像下面这样的例子 //A={9},B[]={5,8,10,20,30}和 //A[]={1},B[]={5,8,10,20,30} 如果(M&1) 返回MO2(B[M/2],MO3(A[0],B[M/2-1],B[M/2+1]); //情况3:如果较大的数组有偶数个元素, //那么中间值将是以下3个元素之一 //…较大数组的中间两个元素 //…较小数组的唯一元素 返回MO3(B[M/2],B[M/2-1],A[0]); } //如果较小的数组有两个元素 else如果(N==2) { //案例4:如果较大的数组也有两个元素, //只需调用MO4() 如果(M==2) 返回MO4(A[0],A[1],B[0],B[1]); //情况5:如果较大的数组具有奇数个元素, //那么中间值将是以下3个元素之一 //1.较大数组的中间元素 //2.较小数组的第一个元素和元素的最大值 //在更大的数组中,就在中间之前 //3.较小数组的第二个元素和元素的最小值 //在更大的数组中位于中间之后 如果(M&1) 返回MO3(B[M/2], 最大值(A[0],B[M/2-1]), 最小值(A[1],B[M/2+1]) ); //情况6:如果较大的数组具有偶数个元素, //那么中间值将是以下4个元素之一 //1)和2)较大数组的中间两个元素 //3)较小数组的第一个元素和元素的最大值 //就在较大数组中第一个中间元素之前 //4.较小数组的第二个元素和元素的最小值 //在更大阵列中的第二个中间位置之后 返回MO4(B[M/2], B[M/2-1], 最大值(A[0],B[M/2-2]), 最小值(A[1],B[M/2+1]) ); } int-idxA=(N-1)/2; int-idxB=(M-1)/2; //如果A[idxA]M) 返回findMedianUtil(B、M、A、N); 返回findMedianUtil(A、N、B、M); } //用于测试上述功能的驱动程序 int main() { int A[]={900}; int B[]={5,8,10,20}; int N=sizeof(A)/sizeof(A[0]); int M=sizeof(B)/sizeof(B[0]); printf(“%f”,findMedian(A,N,B,M)); 返回0; }
  • 知道
    B[M/2]
    B
    的精确中位数(即使用
    B[M/2-1]表示未注释的代码,这两个表达式是等效的-通常是一个糟糕的举动。(您甚至似乎已经手动删除了注释。)我更希望使用此问题演示文稿返回值的定义。您删除了
    假设N小于或等于M
    。请编辑您的问题,并明确询问您遗漏了什么:两个/所有数组/范围都可能被仅在一个数组中找到的值缩短?缩短所有范围不会使问题出在哪里?@greybeard我在编辑方面有问题。你能检查一下吗?无法回答,因为问题还在等待中:1.
    MO4(A[0],B[M/2],B[M/2-1],B[M/2+1])
    等于
    MO2(B[M/2],MO3(A[0],B[M/2-1],B[M/2+1])
    知道
    B[M/2]
    B
    的精确中位数,它将始终被选为
    MO4
    中的一个平均项。2.这遵循分而治之的范例:将问题划分为子问题。在这里,你将两个数组按中位数相等的数量缩短。你不能将两个数组减半,因为它们的大小不同(因此,中位数不再在该范围的中间,即使算法返回错误的值)。我投票赞成重新打开,因为这是一个有效的算法问题,在一个质量良好的状态。(虽然我认为这是错误的原因)(因此给出一个无用的参考链接)。,请访问,并尽可能提出最好的问题。(正如我没有对这个问题发表评论一样,在
    @
    后面提到他的名字是不可能的
    using a:=A[0], b:=B[M/2], bm:=B[M/2-1], bp:=B[M/2+1]
    MO4(a, b, bm, bp)
    = 0.5 * (a + b + bm + bp - min(a, b, bm, bp) - max(a, b, bm, bp))
    = 0.5 * (b + (a + bm + bp - min(a, bm, bp) - max(a, bm, bp))
    = MO2(b, MO3(a, bm, bp))
    
    T(N, M) :=
    | (N < 2 && M < 2)  O(1)
    | (N < 2 && M >= 2) T(M) = O(log M)
    | (N == 2)          T(M) = O(log M)
    | (otherwise)       1 + T(N - N/2, M - N/2)