Дана матрица nxn, где каждая строка и столбец отсортированы в неубывающем порядке. Распечатать все элементы матрицы в отсортированном порядке.
Пример:
Input: mat[][] = { {10, 20, 30, 40},
{15, 25, 35, 45},
{27, 29, 37, 48},
{32, 33, 39, 50},
};
Output:
Elements of matrix in sorted order
10 15 20 25 27 29 30 32 33 35 37 39 40 45 48 50
Мы можем использовать Young Tableau для решения вышеуказанной проблемы. Идея состоит в том, чтобы рассматривать данный двумерный массив как таблицу Юнга и вызывать минимум извлечения O (N)
C ++
#include<iostream> #include<climits>
using namespace std;
#define INF INT_MAX #define N 4
void youngify( int mat[][N], int i, int j)
{
int downVal = (i+1 < N)? mat[i+1][j]: INF;
int rightVal = (j+1 < N)? mat[i][j+1]: INF;
if (downVal==INF && rightVal==INF)
return ;
if (downVal < rightVal)
{
mat[i][j] = downVal;
mat[i+1][j] = INF;
youngify(mat, i+1, j);
}
else
{
mat[i][j] = rightVal;
mat[i][j+1] = INF;
youngify(mat, i, j+1);
}
}
int extractMin( int mat[][N])
{
int ret = mat[0][0];
mat[0][0] = INF;
youngify(mat, 0, 0);
return ret;
}
void printSorted( int mat[][N])
{
cout << "Elements of matrix in sorted order n" ;
for ( int i=0; i<N*N; i++)
cout << extractMin(mat) << " " ;
}
int main()
{
int mat[N][N] = { {10, 20, 30, 40},
{15, 25, 35, 45},
{27, 29, 37, 48},
{32, 33, 39, 50},
};
printSorted(mat);
return 0;
}
|
Джава
class GFG
{
static final int INF = Integer.MAX_VALUE;
static final int N = 4 ;
static void youngify( int mat[][], int i, int j)
{
int downVal = (i + 1 < N) ?
mat[i + 1 ][j] : INF;
int rightVal = (j + 1 < N) ?
mat[i][j + 1 ] : INF;
if (downVal == INF && rightVal == INF)
{
return ;
}
if (downVal < rightVal)
{
mat[i][j] = downVal;
mat[i + 1 ][j] = INF;
youngify(mat, i + 1 , j);
}
else
{
mat[i][j] = rightVal;
mat[i][j + 1 ] = INF;
youngify(mat, i, j + 1 );
}
}
static int extractMin( int mat[][])
{
int ret = mat[ 0 ][ 0 ];
mat[ 0 ][ 0 ] = INF;
youngify(mat, 0 , 0 );
return ret;
}
static void printSorted( int mat[][])
{
System.out.println( "Elements of matrix in sorted order n" );
for ( int i = 0 ; i < N * N; i++)
{
System.out.print(extractMin(mat) + " " );
}
}
public static void main(String args[])
{
int mat[][] = {{ 10 , 20 , 30 , 40 },
{ 15 , 25 , 35 , 45 },
{ 27 , 29 , 37 , 48 },
{ 32 , 33 , 39 , 50 }};
printSorted(mat);
}
}
|
Python 3
import sys
INF = sys.maxsize
N = 4
def youngify(mat, i, j):
downVal = mat[i + 1 ][j] if (i + 1 < N) else INF
rightVal = mat[i][j + 1 ] if (j + 1 < N) else INF
if (downVal = = INF and rightVal = = INF):
return
if (downVal < rightVal):
mat[i][j] = downVal
mat[i + 1 ][j] = INF
youngify(mat, i + 1 , j)
else :
mat[i][j] = rightVal
mat[i][j + 1 ] = INF
youngify(mat, i, j + 1 )
def extractMin(mat):
ret = mat[ 0 ][ 0 ]
mat[ 0 ][ 0 ] = INF
youngify(mat, 0 , 0 )
return ret
def printSorted(mat):
print ( "Elements of matrix in sorted order n" )
i = 0
while i < N * N:
print (extractMin(mat), end = " " )
i + = 1
if __name__ = = "__main__" :
mat = [[ 10 , 20 , 30 , 40 ],
[ 15 , 25 , 35 , 45 ],
[ 27 , 29 , 37 , 48 ],
[ 32 , 33 , 39 , 50 ]]
printSorted(mat)
|
C #
using System;
class GFG
{
static int INF = int .MaxValue;
static int N = 4;
static void youngify( int [,]mat, int i, int j)
{
int downVal = (i + 1 < N) ?
mat[i + 1,j] : INF;
int rightVal = (j + 1 < N) ?
mat[i,j + 1] : INF;
if (downVal == INF && rightVal == INF)
{
return ;
}
if (downVal < rightVal)
{
mat[i,j] = downVal;
mat[i + 1,j] = INF;
youngify(mat, i + 1, j);
}
else
{
mat[i, j] = rightVal;
mat[i, j + 1] = INF;
youngify(mat, i, j + 1);
}
}
static int extractMin( int [,]mat)
{
int ret = mat[0,0];
mat[0, 0] = INF;
youngify(mat, 0, 0);
return ret;
}
static void printSorted( int [,]mat)
{
Console.WriteLine( "Elements of matrix in sorted order n" );
for ( int i = 0; i < N * N; i++)
{
Console.Write(extractMin(mat) + " " );
}
}
static public void Main ()
{
int [,]mat = {{10, 20, 30, 40},
{15, 25, 35, 45},
{27, 29, 37, 48},
{32, 33, 39, 50}};
printSorted(mat);
}
}
|
Выход:
Elements of matrix in sorted order
10 15 20 25 27 29 30 32 33 35 37 39 40 45 48 50
Временная сложность извлечения минимума составляет O (N) и называется O (N 2 ) раз. Следовательно, общая временная сложность составляет O (N 3 ).
Лучшим решением является использование подхода, используемого для объединения k отсортированных массивов . Идея состоит в том, чтобы использовать Min Heap размера N, в которой хранятся элементы первого столбца. До извлечения минимум. В минимуме извлечения замените минимальный элемент следующим элементом строки, из которой извлечен элемент. Временная сложность этого решения составляет O (N 2 LogN).
#include<iostream> #include<climits>
using namespace std;
#define N 4
struct MinHeapNode
{
int element;
int i;
int j;
};
void swap(MinHeapNode *x, MinHeapNode *y);
class MinHeap
{
MinHeapNode *harr;
int heap_size;
public :
MinHeap(MinHeapNode a[], int size);
void MinHeapify( int );
int left( int i) { return (2*i + 1); }
int right( int i) { return (2*i + 2); }
MinHeapNode getMin() { return harr[0]; }
void replaceMin(MinHeapNode x) { harr[0] = x; MinHeapify(0); }
};
void printSorted( int mat[][N])
{
MinHeapNode *harr = new MinHeapNode[N];
for ( int i = 0; i < N; i++)
{
harr[i].element = mat[i][0];
harr[i].i = i;
harr[i].j = 1;
}
MinHeap hp(harr, N);
for ( int count = 0; count < N*N; count++)
{
MinHeapNode root = hp.getMin();
cout << root.element << " " ;
if (root.j < N)
{
root.element = mat[root.i][root.j];
root.j += 1;
}
else root.element = INT_MAX;
hp.replaceMin(root);
}
}
MinHeap::MinHeap(MinHeapNode a[], int size)
{
heap_size = size;
harr = a;
int i = (heap_size - 1)/2;
while (i >= 0)
{
MinHeapify(i);
i--;
}
}
void MinHeap::MinHeapify( int i)
{
int l = left(i);
int r = right(i);
int smallest = i;
if (l < heap_size && harr[l].element < harr[i].element)
smallest = l;
if (r < heap_size && harr[r].element < harr[smallest].element)
smallest = r;
if (smallest != i)
{
swap(&harr[i], &harr[smallest]);
MinHeapify(smallest);
}
}
void swap(MinHeapNode *x, MinHeapNode *y)
{
MinHeapNode temp = *x; *x = *y; *y = temp;
}
int main()
{
int mat[N][N] = { {10, 20, 30, 40},
{15, 25, 35, 45},
{27, 29, 37, 48},
{32, 33, 39, 50},
};
printSorted(mat);
return 0;
}
|
Выход:
10 15 20 25 27 29 30 32 33 35 37 39 40 45 48 50
Упражнение:
Вышеуказанные решения работают для квадратной матрицы. Расширьте вышеприведенные решения для работы с прямоугольной матрицей M * N.
Эта статья предоставлена Варуном . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
Вывести все элементы в отсортированном порядке из отсортированной по строке и столбцу матрицы
0.00 (0%) 0 votes