forked from sevastyan_b/SSPR_25
комменты ридми
This commit is contained in:
@@ -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++) {
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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.
|
||||
Сервисный подход оправдан только в распределенных системах, где требуется интеграция разнородных систем, необходима отказоустойчивость
|
||||
|
||||
Reference in New Issue
Block a user