#478 Параллельный подсчет суммы списка
На вход приходит список чисел, мы хотим посчитать сумму всех этих чисел.
Необходимо считать это быстро. Из-за того, что список большой, решено считать сумму так:
мы разбиваем входной список на части, используя для этого метод split
(на него время тратить не нужно, он здесь просто чтобы библиотеку никакую не тянуть).
Нам это нужно, чтобы каждый подсписок закинуть в отдельный поток, где будет посчитана сумма, и так 10 раз. Когда 10 потоков отработают, мы просто собираем результаты, складываем и получаем итоговую сумму.
/**
* Посчитать сумму элементов списка (более 1 млн. элементов),
* используя для этого 10 потоков
*/
public static long sum(List<Long> numbers) {
final int threads = 10;
List<List<Long>> subLists = split(numbers, threads);
// TODO: make it work!
return ???;
}
private static List<List<Long>> split(List<Long> numbers, int parts) {
int size = numbers.size();
int subListSize = (int) Math.ceil((double) size / parts);
List<List<Long>> result = new ArrayList<>(parts);
for (int i = 0; i < parts; i++) {
int fromIndex = i * subListSize;
if (fromIndex >= size) {
result.add(Collections.emptyList());
} else {
int toIndex = Math.min((i + 1) * subListSize, size);
List<Long> sublist = numbers.subList(fromIndex, toIndex);
result.add(sublist);
}
}
return result;
}
Разбор вопроса
Войди, чтобы начать диалог
Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти
Доступно с Premium
Это лишь одно из решений, доступных с Premium. А ещё:
- 250+ продвинутых лекций
- 1300+ практических заданий
- 500+ решений задач с реальных собеседований
- Именные сертификаты Java Hub
- Расширенный доступ к AI-ментору