Junior — Middle
Кадом усулҳоро метавон барои иҷрои ҳисоб кардани параллелии ҷамъи унсурҳои массив бо истифода аз ForkJoinPool истифода бурд?
sobes.tech AI
Ҷавоб аз AI
Барои ҳисоб кардани ҳамзамон ҷамъи унсурҳои массив бо истифода аз ForkJoinPool, мумкин аст вазифаи рекурсивиро амалӣ кард, ки массивро ба қисмҳо тақсим мекунад ва онҳоро дар параллел ҳисоб мекунад.
Асосӣ идея:
- Агар андозаи зермасив хурд бошад, ҷамъро мустақиман ҳисоб мекунем.
- Дар акси ҳол, зермасивро ба ду қисм тақсим мекунем, ду вазифаи зерро месозем, онҳоро дар параллел иҷро мекунем ва натиҷаҳоро мепайвандем.
Масалан дар Java бо RecursiveTask<Integer>:
import java.util.concurrent.*;
public class SumTask extends RecursiveTask<Integer> {
private static final int THRESHOLD = 1000;
private int[] array;
private int start, end;
public SumTask(int[] array, int start, int end) {
this.array = array;
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
int length = end - start;
if (length <= THRESHOLD) {
int sum = 0;
for (int i = start; i < end; i++) {
sum += array[i];
}
return sum;
} else {
int mid = start + length / 2;
SumTask leftTask = new SumTask(array, start, mid);
SumTask rightTask = new SumTask(array, mid, end);
leftTask.fork(); // оғоз кардани вазифаи чап дар параллел
int rightResult = rightTask.compute(); // ҳисоб кардани вазифаи рост дар ҳоло
int leftResult = leftTask.join(); // интизор шудан барои натиҷаи вазифаи чап
return leftResult + rightResult;
}
}
}
// Истифода:
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));
Ин усул ба самаранокӣ истифодаи бисёрсӯзишро барои суръат бахшидани ҳисоб кардани ҷамъи массиви калон таъмин мекунад.