2/jekyll_site/ru/index.md
2023-12-17 09:39:45 +03:00

5.8 KiB
Raw Blame History

title description sections tags canonical_url url_translated title_translated
Код с комментариями Заметки на тему программирования с примерами кода и комментариями. Решения задач и описания решений.
Решения задач и описания решений
java
комбинаторика
алгоритмы
реализация
множества
подмножества
списки
массивы
циклы
вложенные циклы
/ /en/ 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 %} Рассмотрим задачу, в которой нужно получить все возможные комбинации элементов последовательности, где количество элементов в комбинации не превышает заданного максимума, и напишем метод для решения на Java с соответствующим отбором по минимальному и максимальному количеству элементов.

Размещением называется упорядоченный набор {k} различных элементов из множества {n} различных элементов, где {k ≤ n}. Если {k = n}, то такой упорядоченный набор называется перестановкой. Для универсальности решения перестановки тоже будем учитывать как частный случай размещения. {%- endcapture %} {%- assign articles = articles | push: article_brief %} {%- assign articles = articles | push: "Комбинации элементов по столбцам" %} {%- capture article_brief %} В двухмерном массиве данные хранятся построчно. Рассмотрим алгоритм получения декартова произведения по столбцам с использованием трёх вложенных циклов. Количество строк и колонок может быть произвольным. Последовательно перемножаем колонки таблицы и накапливаем результат. Значения необязательно должны быть заполнены — нулевые элементы отбрасываем. {%- 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 -%}