Добавление описания ключевых моментов кода

This commit is contained in:
IlyasValiulov
2025-03-22 13:31:13 +04:00
parent 51fb8fafb4
commit 06cc27d541

View File

@@ -28,6 +28,96 @@
3. Паралелльая обработка матрицы и поиск каждым сервисом локального максимума в каждой половине.
4. Определение глобального максимума
**Обзор работы программы**
Программа реализует распределенные вычисления в два контейнера.
1. Первый контейнер генерирует матрицу размером 1000*1000
```
int[][] matrix = generateRandomMatrix(1000, 1000);
private static int[][] generateRandomMatrix(int rows, int columns) {
int[][] matrix = new int[rows][columns];
Random random = new Random();
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
matrix[i][j] = random.nextInt(100_000);
}
}
return matrix;
}
```
2. Затем в первом контейнер происходит разделение матрицы на две части
```
int half = matrix.length / 2;
int[][] firstHalf = new int[half][matrix[0].length];
int[][] secondHalf = new int[matrix.length - half][matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
if (i < half) {
firstHalf[i] = matrix[i];
} else {
secondHalf[i - half] = matrix[i];
}
}
```
Первая половина будет обрабатываться локально, вторая половина будет обрабатывать на втором контейнере
3. Распределенная обработка массива
Отправляем вторую половину матрицы во второй контейнер.
```
//создание объекта RestTemplate для выполнения HTTP-запроса
RestTemplate restTemplate = new RestTemplate();
//url адрес второго контейнера
String secondContainerUrl = "http://192.168.5.107:8080/matrix/max";
//отправка пост запроса второй половины матрицы на второй контейнер
ResponseEntity<Integer> response = restTemplate.postForEntity(secondContainerUrl, secondHalf, Integer.class);
```
Затем происходит поиск максимума в каждой половине массива.
В первом контейнере обработка половины массива происходит локально
```
private static int findMaxElement(int[][] matrix) {
int max = Integer.MIN_VALUE;
for (int[] row : matrix) {
for (int value : row) {
if (value > max) {
max = value;
}
}
}
return max;
}
```
Второй контейнер принимает половину матрицы, обрабатывает и отправляет обратно в первый контейнер
```
public int processMatrix(@RequestBody int[][] matrix) {
System.out.println("Server start find max");
int min = Integer.MAX_VALUE;
for (int[] row : matrix) {
for (int value : row) {
if (value < min) {
min = value;
}
}
}
return min;
}
```
Получение результата из второго контейнера и поиск глобального максимума из двух контейнеров
```
int localMax = findMaxElement(firstHalf);
//получение ответа из второго контейнера
int remoteMax = response.getBody();
int globalMax = Math.max(localMax, remoteMax);
```
**Тесты**
Вывод первого контейнера