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

Popular posts from this blog

Sudoku

Longest prefix matching - trie

Climbing Stairs