Javascript Program to Find median in row wise sorted matrix
Last Updated :
12 Sep, 2024
We are given a row-wise sorted matrix of size r*c, we need to find the median of the matrix given. It is assumed that r*c is always odd.
Examples:
Input : 1 3 5
2 6 9
3 6 9
Output : Median is 5
If we put all the values in a sorted
array A[] = 1 2 3 3 5 6 6 9 9)
Input: 1 3 4
2 5 6
7 8 9
Output: Median is 5
Simple Method: The simplest method to solve this problem is to store all the elements of the given matrix in an array of size r*c. Then we can either sort the array and find the median element in O(r*clog(r*c)) or we can use the approach discussed here to find the median in O(r*c). Auxiliary space required will be O(r*c) in both cases.
An efficient approach for this problem is to use a binary search algorithm. The idea is that for a number to be median there should be exactly (n/2) numbers which are less than this number. So, we try to find the count of numbers less than all the numbers. Below is the step by step algorithm for this approach:
Algorithm:
- First, we find the minimum and maximum elements in the matrix. The minimum element can be easily found by comparing the first element of each row, and similarly, the maximum element can be found by comparing the last element of each row.
- Then we use binary search on our range of numbers from minimum to maximum, we find the mid of the min and max and get a count of numbers less than our mid. And accordingly change the min or max.
- For a number to be median, there should be (r*c)/2 numbers smaller than that number. So for every number, we get the count of numbers less than that by using upper_bound() in each row of the matrix, if it is less than the required count, the median must be greater than the selected number, else the median must be less than or equal to the selected number.
Below is the implementation of the above approach:
JavaScript
// JavaScript program to find median
// of a matrix sorted row wise
// Function to find median
// in the matrix
function binaryMedian(m, r, c) {
let max = -1000000000;
let min = 1000000000;
for (let i = 0; i < r; i++) {
// Finding the minimum
// element
if (m[i][0] < min)
min = m[i][0];
// Finding the maximum
// element
if (m[i][c - 1] > max)
max = m[i][c - 1];
}
let desired = parseInt((r * c + 1) / 2);
while (min < max) {
let mid = min + parseInt((max - min) / 2);
let place = 0;
let get = 0;
// Find count of elements
// smaller than mid
for (let i = 0; i < r; ++i) {
let tmp = GetRow(m, i);
for (let j = tmp.length; j >= 0; j--) {
if (tmp[j] <= mid) {
get = j + 1;
break;
}
}
// If element is not found
// in the array the binarySearch()
// method returns (-(insertion_
// point) - 1). So once we know
// the insertion point we can
// find elements Smaller than
// the searched element by the
// following calculation
if (get < 0)
get = Math.abs(get) - 1;
// If element is found in the
// array it returns the index(any
// index in case of duplicate). So
// we go to last index of element
// which will give the number of
// elements smaller than the number
// including the searched element.
else {
while (get < GetRow(m, i).length &&
m[i][get] == mid)
get += 1;
}
place = place + get;
}
if (place < desired)
min = mid + 1;
else
max = mid;
}
return min;
}
function GetRow(matrix, row) {
let rowLength = matrix[0].length;
let rowVector = Array(rowLength).fill(0);
for (let i = 0; i < rowLength; i++)
rowVector[i] = matrix[row][i];
return rowVector;
}
// Driver code
let r = 3, c = 3;
let m = [[1, 3, 5],
[2, 6, 9],
[3, 6, 9]];
console.log("Median is " + binaryMedian(m, r, c));
Complexity Analysis:
- Time Complexity: O(32 * r * log(c)). The upper bound function will take log(c) time and is performed for each row. And since the numbers will be max of 32 bit, so binary search of numbers from min to max will be performed in at most 32 ( log2(2^32) = 32 ) operations.
- Auxiliary Space : O(1)
Please refer complete article on Find median in row wise sorted matrix for more details!
Similar Reads
Find median in row wise sorted matrix Given a row-wise sorted matrix mat[][] of order n * m, where the number of rows and columns are always odd. The task is to find the median of the matrix.Note: Median is the middle number in a sorted ascending or descending list of numbers. In case of an even number of elements return the left median
15+ min read
JavaScript Program to Find Kth Smallest/Largest Element in a Sorted Matrix Given an n x n matrix, where every row and column is sorted in non-decreasing order. Find the kth smallest/largest element in the given 2D array. Examples: Input:k = 3 and array = 10, 20, 30, 40 15, 25, 35, 45 24, 29, 37, 48 32, 33, 39, 50 Output: 20 40Explanation: The 3rd smallest element is 20 The
3 min read
C Program to sort rows of the Matrix Given a matrix arr[][] of dimensions N * M, the task is to sort the matrix such that each row is sorted and the first element of each row is greater than or equal to the last element of the previous row. Examples: Input: N = 3, M = 3, arr[][] = {{7, 8, 9}, {5, 6, 4}, {3, 1, 2}}Output:1 2 34 5 67 8 9
3 min read
PHP Program To Find Mean and Median of an Unsorted Array Given an unsorted array, the task is to find the mean (average) and median of the array in PHP. we will see the approach and code example to solve this problem. ApproachTo find the mean of an array, we need to sum up all the elements in the array and then divide the sum by the total number of elemen
2 min read
Print all elements in sorted order from row and column wise sorted matrix Given an n x n matrix, where every row and column is sorted in non-decreasing order. Print all elements of the matrix in sorted order. Example: Input: mat[][] = { {10, 20, 30, 40}, {15, 25, 35, 45}, {27, 29, 37, 48}, {32, 33, 39, 50}, };Output: 10 15 20 25 27 29 30 32 33 35 37 39 40 45 48 50 Recomme
15+ min read