Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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/8/design-patterns/2.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
Algorithm 按O(logn)复杂度排序的数组的中位数是多少?_Algorithm - Fatal编程技术网

Algorithm 按O(logn)复杂度排序的数组的中位数是多少?

Algorithm 按O(logn)复杂度排序的数组的中位数是多少?,algorithm,Algorithm,按O(logn)复杂度排序的数组的中位数是多少?对O(logn)执行任何操作,然后通过返回O(1)中的值来完成 编辑:此操作未完全完成: 这不是正确的语言语法(因为这是一个算法问题) 它不处理偶数个数组元素 按O(logn)复杂度排序的数组的中位数是多少 两个排序数组的中值 问题:有两个大小分别为n的排序数组A和B。编写一个算法,求合并上述两个数组(即长度为2n的数组)后得到的数组的中值。复杂性应为O(log(n)) 中位数:在概率论和统计学中,中位数是将样本、总体或概率分布的上半

按O(logn)复杂度排序的数组的中位数是多少?

O(logn)
执行任何操作,然后通过返回
O(1)
中的值来完成

编辑:此操作未完全完成:

  • 这不是正确的语言语法(因为这是一个算法问题)
  • 它不处理偶数个数组元素
按O(logn)复杂度排序的数组的中位数是多少

两个排序数组的中值 问题:有两个大小分别为n的排序数组A和B。编写一个算法,求合并上述两个数组(即长度为2n的数组)后得到的数组的中值。复杂性应为O(log(n)) 中位数:在概率论和统计学中,中位数是将样本、总体或概率分布的上半部分与下半部分分开的数字

有限个数字列表的中位数可以通过将所有数字从最低值排列到最高值,然后选择中间的一个来找到。 为了得到输入数组{12,11,15,10,20}的中值,首先对数组进行排序。我们在排序后得到{10,11,12,15,20}。中值是排序数组的中间元素,即12

对于元素数为偶数的数组,取中值有不同的约定,可以取两个中间值的平均值,也可以取第一个中间值,也可以取第二个中间值

让我们看看获得两个大小分别为n的排序数组的中值的不同方法。因为我们寻找的中位数集的大小是偶数(2n),所以我们在下面的所有解中取中间两个数的平均值

方法1(合并时简单计数)

使用合并排序的合并过程。在比较两个数组的元素时跟踪计数。如果计数变为n(对于2n个元素),则我们已达到中值。取合并数组中索引n-1和n处元素的平均值。请参见下面的实现。 实施:

/* This function returns median of ar1[] and ar2[].
Assumptions in this function:

Both ar1[] and ar2[] are sorted arrays
Both have n elements */

int getMedian(int ar1[], int ar2[], int n)

{

int i = 0; /* Current index of i/p array ar1[] */

int j = 0; /* Current index of i/p array ar2[] */

int count;

int m1 = -1, m2 = -1;

/* Since there are 2n elements, median will be average
of elements at index n-1 and n in the array obtained after
merging ar1 and ar2 */

for(count = 0; count <= n; count++)

{

/*Below is to handle case where all elements of ar1[] are
smaller than smallest(or first) element of ar2[]*/

if(i == n)

{

m1 = m2;

m2 = ar2[0];

break;

}

/*Below is to handle case where all elements of ar2[] are
smaller than smallest(or first) element of ar1[]*/

else if(j == n)

{

m1 = m2;

m2 = ar1[0];

break;

}

if(ar1[i] < ar2[j])

{

m1 = m2; /* Store the prev median */

m2 = ar1[i];

i++;

}

else

{

m1 = m2; /* Store the prev median */

m2 = ar2[j];

j++;

}

}

return (m1 + m2)/2;

}

/* Driver program to test above function */

int main()

{

int ar1[] = {1, 12, 15, 26, 38};

int ar2[] = {2, 13, 17, 30, 45};

printf("%d", getMedian(ar1, ar2, 5)) ;

getchar();

return 0;

}
int max(int, int); /* to get maximum of two integers */

int min(int, int); /* to get minimum of two integeres */

int median(int [], int); /* to get median of a single array */

/* This function returns median of ar1[] and ar2[].

Assumptions in this function:

Both ar1[] and ar2[] are sorted arrays

Both have n elements */

int getMedian(int ar1[], int ar2[], int n)

{

int m1; /* For median of ar1 */

int m2; /* For median of ar2 */

/* return -1 for invalid input */

if(n <= 0)

return -1;

if(n == 1)

return (ar1[0] + ar2[0])/2;

if (n == 2)

return (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1])) / 2;

m1 = median(ar1, n); /* get the median of the first array */

m2 = median(ar2, n); /* get the median of the second array */

/* If medians are equal then return either m1 or m2 */

if(m1 == m2)

return m1;

/* if m1 < m2 then median must exist in ar1[m1....] and ar2[....m2] */

if (m1 < m2)

return getMedian(ar1 + n/2, ar2, n - n/2);

/* if m1 > m2 then median must exist in ar1[....m1] and ar2[m2...] */

return getMedian(ar2 + n/2, ar1, n – n/2);

}

/* Driver program to test above function */

int main()

{

int ar1[] = {1, 12, 15, 26, 38};

int ar2[] = {2, 13, 17, 30, 45};

printf(“%d”, getMedian(ar1, ar2, 5)) ;

getchar();

return 0;

}

/* Utility functions */

int max(int x, int y)

{

return x > y? x : y;

}

int min(int x, int y)

{

return x > y? y : x;

}

/* Function to get median of a single array */

int median(int arr[], int n)

{

if(n%2 == 0)

return (arr[n/2] + arr[n/2-1])/2;

else

return arr[n/2];

}
int getMedianRec(int ar1[], int ar2[], int left, int right, int n);

/* This function returns median of ar1[] and ar2[].

Assumptions in this function:

Both ar1[] and ar2[] are sorted arrays

Both have n elements */

int getMedian(int ar1[], int ar2[], int n)

{

return getMedianRec(ar1, ar2, 0, n-1, n);

}

/* A recursive function to get the median of ar1[] and ar2[]

using binary search */

int getMedianRec(int ar1[], int ar2[], int left, int right, int n)

{

int i, j;

/* We have reached at the end (left or right) of ar1[] */

if(left > right)

return getMedianRec(ar2, ar1, 0, n-1, n);

i = (left + right)/2;

j = n – i – 1; /* Index of ar2[] */

/* Recursion terminates here.*/

if(ar1[i] > ar2[j] && (j == n-1 || ar1[i] <= ar2[j+1]))

{

/*ar1[i] is decided as median 2, now select the median 1

(element just before ar1[i] in merged array) to get the

average of both*/

if(ar2[j] > ar1[i-1] || i == 0)

return (ar1[i] + ar2[j])/2;

else

return (ar1[i] + ar1[i-1])/2;

}

/*Search in left half of ar1[]*/

else if (ar1[i] > ar2[j] && j != n-1 && ar1[i] > ar2[j+1])

return getMedianRec(ar1, ar2, left, i-1, n);

/*Search in right half of ar1[]*/

else /* ar1[i] is smaller than both ar2[j] and ar2[j+1]*/

return getMedianRec(ar1, ar2, i+1, right, n);

}

/* Driver program to test above function */

int main()

{

int ar1[] = {1, 12, 15, 26, 38};

int ar2[] = {2, 13, 17, 30, 45};

printf(“%d”, getMedian(ar1, ar2, 5)) ;

getchar();

return 0;

}
/*此函数返回ar1[]和ar2[]的中值。
此函数中的假设:
ar1[]和ar2[]都是排序数组
两者都有n个元素*/
int GETMINAL(int ar1[],int ar2[],int n)
{
int i=0;/*i/p数组ar1的当前索引[]*/
int j=0;/*i/p数组ar2的当前索引[]*/
整数计数;
int m1=-1,m2=-1;
/*因为有2n个元素,所以中值将是平均值
之后获得的数组中索引n-1和n处元素的
合并ar1和ar2*/
对于(计数=0;计数y?x:y;
}
最小整数(整数x,整数y)
{
返回x>y?y:x;
}
/*函数获取单个数组的中值*/
整数中值(整数arr[],整数n)
{
如果(n%2==0)
返回(arr[n/2]+arr[n/2-1])/2;
其他的
返回arr[n/2];
}
时间复杂度:O(logn)

空间复杂度:O(1)

算法范式:分而治之

方法3(通过对中值进行二进制搜索):

基本思想是,如果给定两个数组ar1[]和ar2[],并知道 每个元素都可以检查元素ar1[i]是否为常数时间的中位数。假设中位数为ar1[i]。由于数组已排序,因此它正好大于数组ar1[]中的i-1值。如果它是中位数,则它也正好大于ar2[]中的j=n–i–1元素

它需要恒定的时间来检查ar2[j]

对于两个数组ar1和ar2,首先在ar1[]中进行二进制搜索 如果第一个数组的(或右)未找到中间值,则开始在第二个数组ar2[]中搜索

1) 使用左右数组索引获取ar1[]的中间元素

让中间元素的索引为i

2) 计算ar2[]的相应指数j

j=n-i-1

3) 如果ar1[i]>=ar2[j]和ar1[i]

例如:

ar1[]={1,5,7,10,13}

ar2[]={11,15,23,30,45}

ar1[]的中间元素是7。让我们将7与23和30进行比较,因为7比两者都小 23和30,在ar1[]中向右移动。在{10,13}中进行二进制搜索,此步骤将选择10

现在比较10、15和23。因为10比15和23都小,所以再次移动到 正确的。现在右边只有13个。因为13大于11小于15,所以在这里终止。我们得到的中位数为12(11和13的平均值) 实施:

/* This function returns median of ar1[] and ar2[].
Assumptions in this function:

Both ar1[] and ar2[] are sorted arrays
Both have n elements */

int getMedian(int ar1[], int ar2[], int n)

{

int i = 0; /* Current index of i/p array ar1[] */

int j = 0; /* Current index of i/p array ar2[] */

int count;

int m1 = -1, m2 = -1;

/* Since there are 2n elements, median will be average
of elements at index n-1 and n in the array obtained after
merging ar1 and ar2 */

for(count = 0; count <= n; count++)

{

/*Below is to handle case where all elements of ar1[] are
smaller than smallest(or first) element of ar2[]*/

if(i == n)

{

m1 = m2;

m2 = ar2[0];

break;

}

/*Below is to handle case where all elements of ar2[] are
smaller than smallest(or first) element of ar1[]*/

else if(j == n)

{

m1 = m2;

m2 = ar1[0];

break;

}

if(ar1[i] < ar2[j])

{

m1 = m2; /* Store the prev median */

m2 = ar1[i];

i++;

}

else

{

m1 = m2; /* Store the prev median */

m2 = ar2[j];

j++;

}

}

return (m1 + m2)/2;

}

/* Driver program to test above function */

int main()

{

int ar1[] = {1, 12, 15, 26, 38};

int ar2[] = {2, 13, 17, 30, 45};

printf("%d", getMedian(ar1, ar2, 5)) ;

getchar();

return 0;

}
int max(int, int); /* to get maximum of two integers */

int min(int, int); /* to get minimum of two integeres */

int median(int [], int); /* to get median of a single array */

/* This function returns median of ar1[] and ar2[].

Assumptions in this function:

Both ar1[] and ar2[] are sorted arrays

Both have n elements */

int getMedian(int ar1[], int ar2[], int n)

{

int m1; /* For median of ar1 */

int m2; /* For median of ar2 */

/* return -1 for invalid input */

if(n <= 0)

return -1;

if(n == 1)

return (ar1[0] + ar2[0])/2;

if (n == 2)

return (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1])) / 2;

m1 = median(ar1, n); /* get the median of the first array */

m2 = median(ar2, n); /* get the median of the second array */

/* If medians are equal then return either m1 or m2 */

if(m1 == m2)

return m1;

/* if m1 < m2 then median must exist in ar1[m1....] and ar2[....m2] */

if (m1 < m2)

return getMedian(ar1 + n/2, ar2, n - n/2);

/* if m1 > m2 then median must exist in ar1[....m1] and ar2[m2...] */

return getMedian(ar2 + n/2, ar1, n – n/2);

}

/* Driver program to test above function */

int main()

{

int ar1[] = {1, 12, 15, 26, 38};

int ar2[] = {2, 13, 17, 30, 45};

printf(“%d”, getMedian(ar1, ar2, 5)) ;

getchar();

return 0;

}

/* Utility functions */

int max(int x, int y)

{

return x > y? x : y;

}

int min(int x, int y)

{

return x > y? y : x;

}

/* Function to get median of a single array */

int median(int arr[], int n)

{

if(n%2 == 0)

return (arr[n/2] + arr[n/2-1])/2;

else

return arr[n/2];

}
int getMedianRec(int ar1[], int ar2[], int left, int right, int n);

/* This function returns median of ar1[] and ar2[].

Assumptions in this function:

Both ar1[] and ar2[] are sorted arrays

Both have n elements */

int getMedian(int ar1[], int ar2[], int n)

{

return getMedianRec(ar1, ar2, 0, n-1, n);

}

/* A recursive function to get the median of ar1[] and ar2[]

using binary search */

int getMedianRec(int ar1[], int ar2[], int left, int right, int n)

{

int i, j;

/* We have reached at the end (left or right) of ar1[] */

if(left > right)

return getMedianRec(ar2, ar1, 0, n-1, n);

i = (left + right)/2;

j = n – i – 1; /* Index of ar2[] */

/* Recursion terminates here.*/

if(ar1[i] > ar2[j] && (j == n-1 || ar1[i] <= ar2[j+1]))

{

/*ar1[i] is decided as median 2, now select the median 1

(element just before ar1[i] in merged array) to get the

average of both*/

if(ar2[j] > ar1[i-1] || i == 0)

return (ar1[i] + ar2[j])/2;

else

return (ar1[i] + ar1[i-1])/2;

}

/*Search in left half of ar1[]*/

else if (ar1[i] > ar2[j] && j != n-1 && ar1[i] > ar2[j+1])

return getMedianRec(ar1, ar2, left, i-1, n);

/*Search in right half of ar1[]*/

else /* ar1[i] is smaller than both ar2[j] and ar2[j+1]*/

return getMedianRec(ar1, ar2, i+1, right, n);

}

/* Driver program to test above function */

int main()

{

int ar1[] = {1, 12, 15, 26, 38};

int ar2[] = {2, 13, 17, 30, 45};

printf(“%d”, getMedian(ar1, ar2, 5)) ;

getchar();

return 0;

}
int-getMedianRec(int-ar1[],int-ar2[],int-left,int-right,int-n);
/*此函数返回ar1[]和ar2[]的中值。
此函数中的假设:
ar1[]和ar2[]都是排序数组
两者都有n个元素*/
int GETMINAL(int ar1[],int ar2[],int n)
{
返回getMedianRec(ar1,ar2,0,n-1,n);
}
/*求ar1[]和ar2[]中值的递归函数
使用二进制搜索*/
int getMedianRec(int ar1[],int ar2[],int left,int right,int n)
{
int i,j;
/*我们已到达ar1[]的末尾(左侧或右侧)*/
如果(左>右)
返回getMedianRec(ar2,ar1,0,n-1,n);
i=(左+右)/2;
j=n–i–1;/*ar2的索引[]*/
/*递归在此终止*/
如果(ar1[i]>ar2[j]&(j==n-1 | | | ar1[i]ar1[i-1]| | i==0)
返回(ar1[i]+ar2[j])/2;
其他的
返回(ar1[i]+ar1[i-1])/2;
}
/*在ar1的左半部分搜索[]*/
else如果(ar1[i]>ar2[j]&j!=n-1&&ar1[i]>ar2[j+1])
返回getMedianRec(ar1,ar2,左,i-1,n);
/*在ar1的右半部分搜索[]*/
else/*ar1[i]小于ar2[j]和ar2[j+1]*/
返回getMedianRec(ar1,ar2,i+1,右,n);
}
/*用于测试上述功能的驱动程序*/
int main()
{
int ar1[]={1,12,15,26,38};
int ar2[]={2,13,17,30,45};
printf(“%d”,获取中值(ar1,ar2,5));
getchar();
返回0;
}
时间复杂度:O(logn)

空间复杂度:O(1)

算法范式:分而治之


你确定你指的是排序数组的中位数吗?这是O(1),而不是O(对数n)。现在如果它未排序,那将是另一回事。我相信OP的意思是问两个排序数组的中位数是多少。可以通过执行b