Преобразовать заданную верхнюю треугольную матрицу в одномерный массив
Для данной верхнетреугольной матрицы M [] [] размерности N * N задача состоит в том, чтобы преобразовать ее в одномерный массив, хранящий только ненулевые элементы из матрицы.
Примеры:
Input: M[][] = {{1, 2, 3, 4}, {0, 5, 6, 7}, {0, 0, 8, 9}, {0, 0, 0, 10}}
Output: Row-wise: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Column-wise: {1, 2, 5, 3, 6, 8, 4, 7, 9, 10}
Explanation: All the non-zero elements of the matrix are {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}Input: M[][] = {{1, 2, 3, }, {0, 4, 5}, {0, 0, 6}}
Output: Row-wise: {1, 2, 3, 4, 5, 6}
Column-wise: {1, 2, 4, 3, 5, 6}
Explanation: All the non-zero elements of the matrix are {1, 2, 3, 4, 5, 6}
Подход: чтобы преобразовать заданную двумерную матрицу в одномерный массив, используются следующие два метода:
Строка - Главный порядок:
- В этом методе элементы хранятся таким образом, что последовательные элементы строки последовательно помещаются в массив.
РЯДНЫЙ ЗАКАЗ
- Следующая формула используется для нахождения правильного положения ненулевых элементов матрицы в массиве:
Element present at index (i, j) in the matrix is placed at [N * (i – 1) – (i – 2) * (i -1) /2] + (j – i)
where 1 ≤ i, j ≤ N and i ≤ j
Столбец-майор Порядок:
- В этом методе элементы хранятся таким образом, что последовательные элементы столбца последовательно помещаются в массив.
КОЛОННА-ГЛАВНЫЙ ЗАКАЗ
- Следующая формула используется для определения правильного положения ненулевых элементов матрицы:
Element present at index (i, j) in the matrix is placed at [j * (j – 1) / 2] + i – 1
where 1 ≤ i, j ≤ N and i ≤ j.
Выполните следующие действия, чтобы решить проблему:
- Инициализируйте массив A [] для хранения ненулевых матричных элементов.
- Пройдите по матрице M [] [] .
- Найдите правильные индексы ненулевых матричных элементов в массиве A [], используя приведенные выше формулы.
- Поместите ненулевые элементы в правильные индексы A [] соответственно.
- Наконец, выведите полученный массив A [] .
Ниже представлена реализация описанного выше подхода:
C ++
// C++ Program to convert a given// upper triangular matrix to 1D array#include <iostream>using namespace std;// Create a class of Upper// Triangular Matrixclass UTMatrix {private : // Size of Matrix int n; // Pointer int * A; // Stores count of // non-zero elements int tot;public : // Constructor UTMatrix( int N) { this ->n = N; tot = N * (N + 1) / 2; A = new int [N * (N + 1) / 2]; } // Destructor ~UTMatrix() { delete [] A; } // Function to display array void Display( bool row = true ); // Function to generate array in // Row - Major order void setRowMajor( int i, int j, int x); // Function to generate array in // Column - Major order void setColMajor( int i, int j, int x); // Function to return size of array int getN() { return n; }};// Function to generate array from given matrix// by storing elements in column major ordervoid UTMatrix::setColMajor( int i, int j, int x){ if (i <= j) { int index = ((j * (j - 1)) / 2) + i - 1; A[index] = x; }}// Function to generate array from given matrix// by storing elements in row major ordervoid UTMatrix::setRowMajor( int i, int j, int x){ if (i <= j) { int index = (n * (i - 1) - (((i - 2) * (i - 1)) / 2)) + (j - i); A[index] = x; }}// Function to display array elementsvoid UTMatrix::Display( row) bool{ for ( int i = 0; i < tot; i++) { cout << A[i] << " " ; } cout << endl;}// Function to generate and// display array in Row-Major Ordervoid displayRowMajor( int N){ UTMatrix rm(N); // Generate array in // row-major form rm.setRowMajor(1, 1, 1); rm.setRowMajor(1, 2, 2); rm.setRowMajor(1, 3, 3); rm.setRowMajor(1, 4, 4); rm.setRowMajor(2, 2, 5); rm.setRowMajor(2, 3, 6); rm.setRowMajor(2, 4, 7); rm.setRowMajor(3, 3, 8); rm.setRowMajor(3, 4, 9); rm.setRowMajor(4, 4, 10); // Display array elements in // row-major order cout << "Row-Wise: " ; rm.Display();}// Function to generate and display// array in Column-Major Ordervoid displayColMajor( int N){ UTMatrix cm(N); // Generate array in // column-major form cm.setColMajor(1, 1, 1); cm.setColMajor(1, 2, 2); cm.setColMajor(1, 3, 3); cm.setColMajor(1, 4, 4); cm.setColMajor(2, 2, 5); cm.setColMajor(2, 3, 6); cm.setColMajor(2, 4, 7); cm.setColMajor(3, 3, 8); cm.setColMajor(3, 4, 9); cm.setColMajor(4, 4, 10); // Display array elements in // column-major form cout << "Column-wise: " ; cm.Display( false );}// Driver Codeint main(){ // Size of row or column // of square matrix int N = 4; displayRowMajor(N); displayColMajor(N); return 0;} |
Ява
// Java program to convert a given// upper triangular matrix to 1D array// Create a class of Upper// Triangular Matrixclass UTMatrix{ // Size of Matrixprivate int n;private int [] A = new int [n];// Stores count of// non-zero elementsprivate int tot;// Constructorpublic UTMatrix( int N){ this .n = N; tot = N * (N + 1 ) / 2 ; A = new int [N * (N + 1 ) / 2 ];}// Function to display arrayvoid Display( boolean row){ for ( int i = 0 ; i < tot; i++) { System.out.print(A[i] + " " ); } System.out.println();}// Function to generate array in// Row - Major ordervoid setRowMajor( int i, int j, int x){ if (i <= j) { int index = (n * (i - 1 ) - (((i - 2 ) * (i - 1 )) / 2 )) + (j - i); A[index] = x; }}// Function to generate array in// Column - Major ordervoid setColMajor( int i, int j, int x){ if (i <= j) { int index = ((j * (j - 1 )) / 2 ) + i - 1 ; A[index] = x; }}// Function to return size of arrayint getN(){ return n;}}class GFG{// Function to generate and// display array in Row-Major Orderstatic void displayRowMajor( int N){ UTMatrix rm = new UTMatrix(N); // Generate array in // row-major form rm.setRowMajor( 1 , 1 , 1 ); rm.setRowMajor( 1 , 2 , 2 ); rm.setRowMajor( 1 , 3 , 3 ); rm.setRowMajor( 1 , 4 , 4 ); rm.setRowMajor( 2 , 2 , 5 ); rm.setRowMajor( 2 , 3 , 6 ); rm.setRowMajor( 2 , 4 , 7 ); rm.setRowMajor( 3 , 3 , 8 ); rm.setRowMajor( 3 , 4 , 9 ); rm.setRowMajor( 4 , 4 , 10 ); // Display array elements in // row-major order System.out.print( "Row-Wise: " ); rm.Display( false );}// Function to generate and display// array in Column-Major Orderstatic void displayColMajor( int N){ UTMatrix cm = new UTMatrix(N); // Generate array in // column-major form cm.setColMajor( 1 , 1 , 1 ); cm.setColMajor( 1 , 2 , 2 ); cm.setColMajor( 1 , 3 , 3 ); cm.setColMajor( 1 , 4 , 4 ); cm.setColMajor( 2 , 2 , 5 ); cm.setColMajor( 2 , 3 , 6 ); cm.setColMajor( 2 , 4 , 7 ); cm.setColMajor( 3 , 3 , 8 ); cm.setColMajor( 3 , 4 , 9 ); cm.setColMajor( 4 , 4 , 10 ); // Display array elements in // column-major form System.out.print( "Column-wise: " ); cm.Display( false );}// Driver Codepublic static void main(String[] args){ // Size of row or column // of square matrix int N = 4 ; displayRowMajor(N); displayColMajor(N);}}// This code is contributed by dharanendralv23 |
По строкам: 1 2 3 4 5 6 7 8 9 10 По столбцам: 1 2 5 3 6 8 4 7 9 10
Сложность времени: O (N * N)
Вспомогательное пространство: O (N * N)
Вниманию читателя! Не прекращайте учиться сейчас. Получите все важные математические концепции для соревновательного программирования с курсом Essential Maths for CP по доступной для студентов цене. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .