Algorithm 按O(logn)复杂度排序的数组的中位数是多少?
按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(1)
中的值来完成
编辑:此操作未完全完成:
- 这不是正确的语言语法(因为这是一个算法问题)
- 它不处理偶数个数组元素
/* 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