НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ
“КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ
імені ІГОРЯ СІКОРСЬКОГО”
ЗВІТ
з лабораторної роботи №6
з навчальної дисципліни “Програмування складних алгоритмів”
Тема:
«Розріджені матриці»
Варіант 13
Київ 2022
Мета: Метою лабораторної роботи є ознайомитися з основами роботи з представленням у пам’яті розріджених матриць, зберіганням та обробкою такого вигляду матриць.
Теоретичні відомості
Розріджена матриця — матриця, більша частина елементів якої є нулі. Немає єдиного визначення, яка кількість ненульових елементів має бути в матриці, щоб вона була розрідженою.
Величезні розріджені матриці часто виникають, наприклад, при чисельному розв’язуванні диференціальних рівнянь у частинних похідних.
Зберігати цілу матрицю у пам'яті комп'ютера є неефективно по відношенню до пам'яті, тому є альтернативні способи збереження таких матриць.
Одним з таких способів полягає в зберіганні ненульових елементів та їх координат. Цей спосіб є економний для пам'яті але для виконання дій з матрицями (додавання, множення) він є неефективний, оскільки кожного разу потрібно перебирати всі елементи для пошуку відповідного елемента.
У цьому способі збереження кожен ненульовий елемент зберігається у вигляді значення, номера рядка та стовпця і вказівника на наступний елемент в рядку і стовпці. Для цього методу збереження потрібно також зберігати рамку, яка складається з таких самих елементів, до якої ми будемо прив'язувати всі елементи вказівниками. Цей спосіб потребує більше пам'яті, але при цьому збільшується швидкість виконання дій над матрицями.
Для матриці порядку n елементів кількість ненульових елементів
/
Завдання до лабороторної роботи:
Розробити спосіб економного зберігання в пам’яті розріджених матриць
Виконати індивідуальне завдання над стисненою матрицею.
Вивести матрицю до та після обробки у стисненому та розгорнутому
вигляді
/
Рисунок 1. Завдання 13 варіанту.
Результат роботи
/
/
/
/
Висновки: розроблено програму, що виконує створення такої матриці, в якої більшість елементів є нулями, тобто таку матрицю можна назвати розрідженою. Для економного представлення такої матриці у пам’яті побудовано клас SparseMatrix, який представляє розріджену матрицю як масив підкласів, полями яких є координати ненульового елменту та його значення. Оброблено розріджену матрицю за особистим завданням.
Програмний код
class Lr6{ public static void main(String[] args) { System.out.println("Матриця ДО обробки у розгорнутому вигляді:"); var matrix = createDefaultMatrix(10); displayDefaultMatrix(matrix); System.out.println("Матриця ДО обробки у стисненому вигляді:"); SparseMatrix sparseMatrix = new SparseMatrix(matrix); sparseMatrix.display(); System.out.println("Матриця ПІСЛЯ обробки у розгорнутому вигляді:"); sparseMatrix.task(); displayDefaultMatrix(sparseMatrix.getDefaultMatrix()); System.out.println("Матриця ПІСЛЯ обробки у стисненому вигляді:"); sparseMatrix.display(); } static int[][] createDefaultMatrix(int n) { int[][] arr = new int[n][n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { double rand = Math.random(); if (rand >= 0.7 && rand <= 0.9) arr[i][j] = (int)(Math.random() * 9.0) + 1; } } return arr; } static void displayDefaultMatrix(int[][] arr) { for (int i = 0; i < arr.length; i++) { System.out.println(Arrays.toString(arr[i])); } }}class SparseMatrix{ SparseMatrixElement[] matrix; int columns; int rows; SparseMatrix(int[][] defaultMatrix) { List<SparseMatrixElement> list = new ArrayList<SparseMatrixElement>(); for (int i = 0; i < defaultMatrix.length; i++) for (int j = 0; j < defaultMatrix[i].length; j++) { if (defaultMatrix[i][j] != 0) { list.add(new SparseMatrixElement(new Point(i, j), defaultMatrix[i][j])); } } matrix = new SparseMatrixElement[list.size()]; list.toArray(matrix); rows = defaultMatrix.length; columns = defaultMatrix[0].length; } void display() { for (int i = 0; i< matrix.length; i++) System.out.println("<"+matrix[i].position.x+", "+matrix[i].position.y+"> = "+matrix[i].value); } void task() { for (int i = 0; i < rows; i++) { for (int j = 0; j <= columns - 5; j+=5) { replace(new Point(i,j), new Point(i,j+4)); replace(new Point(i,j+1), new Point(i,j+3)); } } } void replace(Point pos1, Point pos2) { SparseMatrixElement el1 = find(pos1); SparseMatrixElement el2 = find(pos2); if (el1 == null && el2 == null) return; if (el1 != null && el2 != null) { el1.position = pos2; el2.position = pos1; return; } if (el1 != null) { el1.position = pos2; return; } if (el2 != null) { el2.position = pos1; return; } } SparseMatrixElement find(Point pos) { for (int i = 0; i < matrix.length; i++) if (matrix[i].position.x == pos.x && matrix[i].position.y == pos.y) return matrix[i]; return null; } int[][] getDefaultMatrix() { int[][] arr = new int[rows][columns]; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { SparseMatrixElement current = find(new Point(i, j)); if (current == null) arr[i][j] = 0; else arr[i][j] = current.value; } } return arr; } private class SparseMatrixElement { Point position; int value; SparseMatrixElement(Point point, int val) { position = point; value = val; } }}