2023-12-17 07:55:45 +03:00
|
|
|
|
---
|
|
|
|
|
title: Код с комментариями
|
|
|
|
|
description: Заметки на тему программирования с примерами кода и комментариями. Решения задач и описания решений.
|
|
|
|
|
sections: [Решения задач и описания решений]
|
|
|
|
|
tags: [java,комбинаторика,алгоритмы,реализация,множества,подмножества,списки,массивы,циклы,вложенные циклы]
|
|
|
|
|
canonical_url: /
|
|
|
|
|
url_translated: /en/
|
|
|
|
|
title_translated: Code with comments
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
{%- assign articles = "" | split: "" %}
|
|
|
|
|
{%- assign articles = articles | push: "Декартово произведение в параллельных потоках" %}
|
|
|
|
|
{%- capture article_brief %}
|
|
|
|
|
Рассмотрим алгоритм получения *декартова произведения* с помощью потоков Java Stream. Это решение
|
|
|
|
|
похоже на три вложенных цикла `for` с тем отличием, что здесь внешний цикл заменён на поток для
|
|
|
|
|
удобства последующего распараллеливания. Будем использовать метод `reduce` с тремя параметрами:
|
|
|
|
|
`identity`, `accumulator` и `combiner`.
|
|
|
|
|
|
|
|
|
|
В параллельном режиме скорость работы алгоритма увеличивается при перемножении *большого количества
|
|
|
|
|
маленьких списков*, например 20 списков по 2 элемента или 15 списков по 3 элемента. Время вычислений
|
|
|
|
|
уменьшается в *полтора-два* раза. В остальных случаях время работы примерно такое же, как у трёх
|
|
|
|
|
вложенных циклов `for`.
|
|
|
|
|
{%- endcapture %}
|
|
|
|
|
{%- assign articles = articles | push: article_brief %}
|
|
|
|
|
{%- assign articles = articles | push: "Комбинации элементов последовательности" %}
|
|
|
|
|
{%- capture article_brief %}
|
|
|
|
|
Рассмотрим задачу, в которой нужно получить все возможные комбинации элементов последовательности,
|
2023-12-17 09:39:45 +03:00
|
|
|
|
где количество элементов в комбинации не превышает заданного максимума, и напишем метод для решения
|
|
|
|
|
на Java с соответствующим отбором по минимальному и максимальному количеству элементов.
|
2023-12-17 07:55:45 +03:00
|
|
|
|
|
2023-12-17 08:09:03 +03:00
|
|
|
|
*Размещением* называется упорядоченный набор {`k`} различных элементов из множества {`n`} различных
|
|
|
|
|
элементов, где {<code>k ≤ n</code>}. Если {<code>k = n</code>}, то такой
|
|
|
|
|
упорядоченный набор называется *перестановкой*. Для универсальности решения *перестановки* тоже
|
|
|
|
|
будем учитывать как частный случай *размещения*.
|
2023-12-17 07:55:45 +03:00
|
|
|
|
{%- endcapture %}
|
|
|
|
|
{%- assign articles = articles | push: article_brief %}
|
|
|
|
|
{%- assign articles = articles | push: "Комбинации элементов по столбцам" %}
|
|
|
|
|
{%- capture article_brief %}
|
|
|
|
|
В двухмерном массиве данные хранятся построчно. Рассмотрим алгоритм получения *декартова
|
|
|
|
|
произведения* по столбцам с использованием трёх вложенных циклов. Количество строк и
|
2023-12-17 09:39:45 +03:00
|
|
|
|
колонок может быть произвольным. Последовательно перемножаем колонки таблицы и накапливаем
|
2023-12-17 07:55:45 +03:00
|
|
|
|
результат. Значения необязательно должны быть заполнены — нулевые элементы отбрасываем.
|
|
|
|
|
{%- endcapture %}
|
|
|
|
|
{%- assign articles = articles | push: article_brief %}
|
|
|
|
|
{%- assign articles = articles | push: "Треугольник Паскаля на Java" %}
|
|
|
|
|
{%- capture article_brief %}
|
|
|
|
|
Рассмотрим вариант реализации *треугольника Паскаля* на Java. Для простоты хранения и обработки
|
|
|
|
|
данных представим треугольник в виде двухмерного массива, в котором элементы первой строки и колонки
|
|
|
|
|
равны единице, а все остальные элементы — есть сумма двух предыдущих элементов в строке и в колонке.
|
|
|
|
|
{%- endcapture %}
|
|
|
|
|
{%- assign articles = articles | push: article_brief %}
|
|
|
|
|
{%- assign articles = articles | push: "Декартово произведение множеств" %}
|
|
|
|
|
{%- capture article_brief %}
|
|
|
|
|
Рассмотрим алгоритм получения *декартова произведения* нескольких множеств с использованием
|
|
|
|
|
трёх вложенных циклов. Количество множеств и их элементов может быть произвольным. Последовательно
|
|
|
|
|
перемножаем множества и накапливаем результат. Порядок значения не имеет, так как от перестановки
|
|
|
|
|
множителей произведение не меняется. В результате порядок будет отличаться, но комбинации будут
|
|
|
|
|
те же самые.
|
|
|
|
|
{%- endcapture %}
|
|
|
|
|
{%- assign articles = articles | push: article_brief %}
|
|
|
|
|
{%- include main_page.html articles = articles -%}
|