【发布时间】:2014-10-12 02:33:22
【问题描述】:
我遵循中值比较算法来查找两个排序数组的中值并在 java 中实现。根据算法时间复杂度是 O(lgn) 但由于它涉及创建子数组(方法 createSubArr),所以我认为根据我的代码它是 O(n)。下面是我实现的代码。
class Median
{
public static void main (String[] args)
{
int[] a = {1,12,15,26,38,40};
int[] b = {2,13,17,30,45,50};
System.out.println(getMedian(a,b,6));
}
private static int median(int[] a, int n){
if(n % 2 == 0) return (a[n/2] + a[(n/2)-1])/2;
else return a[n/2];
}
private static void show(int[] a) {
for(int i=0;i<a.length;i++) System.out.print(a[i] + " ");
System.out.println();
}
private static int[] createSubArr(int[] a, int start){
int[] sub = new int[a.length-start];
for(int i=0;i<a.length-start;i++) sub[i] = a[start+i];
return sub;
}
private static int getMedian(int[] a, int[] b,int n){
int m1,m2;
int start=-1;
int ans = -1;
if(n<=0) return -1;
if(n==1) return (a[0] + b[0])/2;
if(n==2) return (Math.max(a[0],b[0]) + Math.min(a[1],b[1]) )/2;
m1=median(a,n);
m2=median(b,n);
if(m1 < m2) {
if(n%2==0){
start = (n/2)-1;
a = createSubArr(a,start);
}
else {
start = (n/2);
a = createSubArr(a,(n/2));
}
}else{
if(n%2==0){
start = (n/2)-1;
b = createSubArr(b,start);
}
else {
start = (n/2);
b = createSubArr(b,start);
}
}
return getMedian(a,b,n-start);
}
}
谢谢。
【问题讨论】:
-
为子数组创建一个抽象,而不是从一个复制到另一个。
-
你能解释一下吗?谢谢
-
它将是 (max(1,3) + min(2,4))/2 = (3+2)/2 这与数组是 [1,2,3, 4]
标签: arrays algorithm time-complexity median