Median in two sorted array
/***
There
are two sorted arrays A and B of size m and n respectively.
Find
the median of the two sorted arrays.
Solution:
1)
linear O(n) two index
2)
improved BS O(log(n))
***/
#include<iostream>
using namespace std;
int median_linear(int *a, int *b, int asz, int bsz) {
int a_index = 0, b_index = 0;
int median, index, sz, pre;
median = INT_MIN;
sz = asz + bsz;
index = (asz + bsz)/2;
//edge
case - constant time
if(asz == 0 && bsz != 0) {
if(sz % 2) return b[index];
else return (b[index-1] + b[index])/2;
} else if(bsz == 0 && asz != 0) {
if(sz % 2) return a[index];
else return (a[index-1] + a[index])/2;
} else if(asz == 0 && bsz == 0) return INT_MIN;
else {
while(a_index != asz && b_index != bsz && index >= 0) {
if(a[a_index] < b[b_index]) {
pre = median;
median = a[a_index++];
} else {
pre = median;
median = b[b_index++];
}
index--;
}
if(index < 0) {
if(sz % 2) return median;
else return (median + pre) / 2;
} else {
if(a_index == asz) {
if(sz % 2) return b[b_index+index];
else return (b[b_index+index] + b[b_index+index-1])/2;
} else {
if(sz % 2) return a[a_index+index];
else return (a[a_index+index] + a[a_index+index-1])/2;
}
}
}
}
void median_log(int *a, int *b, int asz, int bsz, int &median, int index, int flag) {
//base
case
if (asz == 0 && bsz == 0) {
median = INT_MIN;
return;
}
if (asz == 0) {
if (flag) median = b[index];
else median = (b[index] + b[index+1])/2;
return;
}
if (bsz == 0) {
if (flag) median = a[index];
else median = (a[index] + a[index+1])/2;
return;
}
if (index == 1) {
if (flag) median = min(a[0], b[0]);
else {
if(a[0] < b[0])
median = (a[0] + min(a[1], b[0]))/2;
else median = (b[0] + min(a[0], b[1]))/2;
}
return;
}
int sub = index/2;
int asub = min(asz, sub);
int bsub = min(bsz, sub);
if (a[sub-1] < b[sub-1])
median_log(a+asub, b, asz-asub, bsz, median, index-asub, flag);
else median_log(a, b+bsub, asz, bsz-bsub, median, index-bsub, flag);
}
void main() {
int a[] = {1, 3, 6, 8, 11, 25};
int b[] = {2, 5, 9, 19};
int asz = sizeof(a) / sizeof(int);
int bsz = sizeof(b) / sizeof(int);
cout<<median_linear(a, b, asz,
bsz)<<endl;
int median = INT_MIN;
int sz = asz + bsz;
int index = sz/2;
if (sz % 2)
{
median_log(a, b, asz, bsz, median,
index+1, 1);
} else median_log(a, b, asz, bsz, median, index, 0);
cout<<median<<endl;
}
Comments
Post a Comment