комменты ридми

This commit is contained in:
Mi
2025-03-22 14:58:25 +04:00
parent 6d2a3f081c
commit d576d70337
3 changed files with 95 additions and 34 deletions

View File

@@ -8,9 +8,6 @@ import java.util.Random;
@RestController
@RequestMapping("/matrix")
public class MatrixGeneratorController {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
@GetMapping("/generate")
public double[][] generateMatrix(@RequestParam int size) {
@@ -18,7 +15,6 @@ public class MatrixGeneratorController {
double[][] matrix = new double[size][size];
System.out.println("Generating matrix of size: " + size + "x" + size);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
matrix[i][j] = rand.nextDouble() * 100;
@@ -27,8 +23,6 @@ public class MatrixGeneratorController {
return matrix;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@PostMapping("/process")
public double[][] processMatrix(@RequestBody double[][] matrix) {
System.out.println("Processing matrix with dimensions: "
@@ -36,20 +30,15 @@ public class MatrixGeneratorController {
return sortColumnsByFirstElement(matrix);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private double[][] sortColumnsByFirstElement(double[][] matrix) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (matrix.length == 0 || matrix[0].length == 0) {
return matrix;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Integer[] columns = new Integer[matrix[0].length];
for (int i = 0; i < columns.length; i++) columns[i] = i;
Arrays.sort(columns, Comparator.comparingDouble(col -> matrix[0][col]));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double[][] sortedMatrix = new double[matrix.length][matrix[0].length];
for (int i = 0; i < columns.length; i++) {
for (int j = 0; j < matrix.length; j++) {

View File

@@ -9,12 +9,9 @@ import java.util.concurrent.CompletableFuture;
@RestController
@RequestMapping("/matrix")
public class MatrixProcessorController {
// URL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private final String generatorUrl = "http://192.168.22.123:8080/matrix/generate?size=";
// URL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private final String processHalfUrl = "http://192.168.22.124:8080/matrix/process";
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10x10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private void printMatrix(String name, double[][] matrix) {
int maxRows = Math.min(matrix.length, 10);
int maxCols = maxRows > 0 ? Math.min(matrix[0].length, 10) : 0;
@@ -28,18 +25,15 @@ public class MatrixProcessorController {
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@GetMapping("/process")
public String processMatrix(@RequestParam int size) {
RestTemplate restTemplate = new RestTemplate();
long startTime = System.currentTimeMillis();
System.out.println("Program started...");
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double[][] matrix = restTemplate.getForObject(generatorUrl + size, double[][].class);
printMatrix("Original matrix", matrix);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
int cols = matrix[0].length;
int splitIndex = cols / 2;
@@ -53,10 +47,8 @@ public class MatrixProcessorController {
printMatrix("Left part", leftPart);
printMatrix("Right part", rightPart);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CompletableFuture<double[][]> processedLeftFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("\nStart local processing...");
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
double[][] result = processMatrixLocally(leftPart);
printMatrix("Locally processed left part", result);
return result;
@@ -64,44 +56,34 @@ public class MatrixProcessorController {
CompletableFuture<double[][]> processedRightFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("\nStart remote processing...");
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> REST API
double[][] result = restTemplate.postForObject(processHalfUrl, rightPart, double[][].class);
printMatrix("Remotely processed right part", result);
return result;
});
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
CompletableFuture.allOf(processedLeftFuture, processedRightFuture).join();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double[][] left = processedLeftFuture.join();
double[][] right = processedRightFuture.join();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double[][] mergedMatrix = mergeSortedColumns(left, right);
printMatrix("\nFinal merged matrix", mergedMatrix);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long endTime = System.currentTimeMillis();
System.out.println("\nMatrix processed successfully. Total time: " + (endTime - startTime) + "ms");
return "Matrix processed successfully: " + (endTime - startTime) + "ms";
}
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
private double[][] processMatrixLocally(double[][] matrix) {
return sortColumnsByFirstElement(matrix);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private double[][] sortColumnsByFirstElement(double[][] matrix) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Integer[] columns = new Integer[matrix[0].length];
for (int i = 0; i < columns.length; i++) columns[i] = i;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Arrays.sort(columns, Comparator.comparingDouble(col -> matrix[0][col]));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double[][] sorted = new double[matrix.length][matrix[0].length];
for (int i = 0; i < columns.length; i++) {
for (int j = 0; j < matrix.length; j++) {
@@ -111,14 +93,12 @@ public class MatrixProcessorController {
return sorted;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private double[][] mergeSortedColumns(double[][] left, double[][] right) {
int totalCols = left[0].length + right[0].length;
double[][] merged = new double[left.length][totalCols];
int i = 0, j = 0, k = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> merge sort
while (i < left[0].length && j < right[0].length) {
if (left[0][i] <= right[0][j]) {
copyColumn(left, i++, merged, k++);
@@ -126,8 +106,6 @@ public class MatrixProcessorController {
copyColumn(right, j++, merged, k++);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (i < left[0].length) {
copyColumn(left, i++, merged, k++);
}
@@ -139,7 +117,6 @@ public class MatrixProcessorController {
return merged;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private void copyColumn(double[][] source, int srcCol, double[][] dest, int destCol) {
for (int row = 0; row < source.length; row++) {
dest[row][destCol] = source[row][srcCol];

View File

@@ -45,6 +45,98 @@ MatrixGeneratorController: Генерирует случайные матриц
Столбцы из обеих частей объединяются по принципу merge sort
Сохраняется общий порядок сортировки по первому элементу
Описание кода:
======Класс MatrixGeneratorController======
//Генерация квадратной матрицы случайных чисел
@GetMapping("/generate")
public double[][] generateMatrix(@RequestParam int size) {
//Обработка матрицы - сортировка столбцов по первому элементу
@PostMapping("/process")
public double[][] processMatrix(@RequestBody double[][] matrix) {
System.out.println("Processing matrix with dimensions: "
+ matrix.length + "x" + (matrix.length > 0 ? matrix[0].length : 0));
return sortColumnsByFirstElement(matrix);
}
//Сортировка столбцов матрицы по значению первого элемента
private double[][] sortColumnsByFirstElement(double[][] matrix) {
// Проверка на пустую матрицу
if (matrix.length == 0 || matrix[0].length == 0) {
return matrix;
}
// Создание и сортировка индексов столбцов
Integer[] columns = new Integer[matrix[0].length];
for (int i = 0; i < columns.length; i++) columns[i] = i;
Arrays.sort(columns, Comparator.comparingDouble(col -> matrix[0][col]));
// Создание новой матрицы с отсортированными столбцами
double[][] sortedMatrix = new double[matrix.length][matrix[0].length];
======Класс MatrixProcessorController======
// URL сервиса для генерации матриц
private final String generatorUrl = "http://192.168.22.123:8080/matrix/generate?size=";
// URL удаленного сервиса для обработки половин матрицы
private final String processHalfUrl = "http://192.168.22.124:8080/matrix/process";
// Вспомогательный метод для вывода первых 10x10 элементов матрицы
private void printMatrix(String name, double[][] matrix) {
// Основной эндпоинт для обработки матрицы
@GetMapping("/process")
public String processMatrix(@RequestParam int size) {
RestTemplate restTemplate = new RestTemplate();
long startTime = System.currentTimeMillis();
System.out.println("Program started...");
//Получение исходной матрицы из сервиса-генератора
double[][] matrix = restTemplate.getForObject(generatorUrl + size, double[][].class);
printMatrix("Original matrix", matrix);
//Разделение матрицы на левую и правую части
int cols = matrix[0].length;
int splitIndex = cols / 2;
//Параллельная обработка половин матрицы
CompletableFuture<double[][]> processedLeftFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("\nStart local processing...");
./Локальная обработка левой части (сортировка столбцов)
double[][] result = processMatrixLocally(leftPart);
CompletableFuture<double[][]> processedRightFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("\nStart remote processing...");
//Удаленная обработка правой части через REST API
double[][] result = restTemplate.postForObject(processHalfUrl, rightPart, double[][].class);
printMatrix("Remotely processed right part", result);
return result;
});
//Ожидание завершения обеих задач
CompletableFuture.allOf(processedLeftFuture, processedRightFuture).join();
//Получение результатов обработки
double[][] left = processedLeftFuture.join();
double[][] right = processedRightFuture.join();
//Слияние и финальная сортировка столбцов
double[][] mergedMatrix = mergeSortedColumns(left, right);
printMatrix("\nFinal merged matrix", mergedMatrix);
//Завершение работы и вывод статистики
long endTime = System.currentTimeMillis();
// Метод для локальной обработки (сортировка столбцов по первому элементу)
private double[][] processMatrixLocally(double[][] matrix) {
// Алгоритм сортировки столбцов по первому элементу
private double[][] sortColumnsByFirstElement(double[][] matrix) {
// Создаем массив индексов столбцов для сортировки
Integer[] columns = new Integer[matrix[0].length];
for (int i = 0; i < columns.length; i++) columns[i] = i;
// Сортировка индексов по значению первого элемента столбца
Arrays.sort(columns, Comparator.comparingDouble(col -> matrix[0][col]));
// Создание новой матрицы с отсортированными столбцами
double[][] sorted = new double[matrix.length][matrix[0].length];
// Слияние двух отсортированных матриц с сохранением порядка сортировки
private double[][] mergeSortedColumns(double[][] left, double[][] right) {
// Вспомогательный метод для копирования столбца между матрицами
private void copyColumn(double[][] source, int srcCol, double[][] dest, int destCol) {
Тесты:
====Вывод контейнера CT123====
Generate matrix for size: 100
@@ -218,4 +310,7 @@ Matrix processed successfully. Total time: 2757ms
Вывод:
Сравнивая с результами предыдущих лабораторных работ:
Однопоточный 14мс; Многопоточный (ThreadPool) 43мс; MPI 99мс. Можно сделать вывод, что сервисный подход медленнее локальных методов для матриц 1000x1000. Причины тому: накладные расходы на сериализацию/десериализацию данных, задержки сетевого взаимодействия между контейнерами.
Для задач сортировки матриц сервисный подход на Spring Boot не оправдан при размерах данных менее 100k×100k. Многопоточные решения внутри одного JVM-процесса демонстрируют на порядок лучшую производительность благодаря отсутствию сетевых издержек и эффективному использованию ресурсов CPU.
Сервисный подход оправдан только в распределенных системах, где требуется интеграция разнородных систем, необходима отказоустойчивость