Аннотация:
Представлен итерационный алгоритм перебора разбиений конечного множества, состоящего из различимых элементов, на подмножества заданной мощности. Мощности некоторых подмножеств могут совпадать. Весь алгоритм состоит из двух независимых алгоритмов. Первый алгоритм определяет, в подмножество какой мощности при разбиении попадет каждый элемент исходного множества. Для этого подмножества одинаковой мощности объединяются в составные подмножества. Производится распределение элементов исходного множества по составным подмножествам. Разбиения описываются индексным массивом, указывающим, в какое составное подмножество распределяется каждый элемент исходного множества. Перебор разбиений исходного множества по составным подмножествам сводится к перебору всех перестановок индексов в массиве. Второй алгоритм распределяет элементы внутри каждого составного подмножества по равномощным подмножествам. При этом для каждого составного подмножества создается свой индексный массив, описывающий, в какое подмножество попадает каждый элемент составного подмножества. Перебор всех разбиений составного подмножества по равномощным подмножествам сводится к частичному перебору перестановок индексов. Перестановки всех индексных массивов перебираются в лексикографическом порядке. Такое построение алгоритма позволяет разбить весь перебор на независимые части и использовать параллельные вычисления. Рассмотрен пример, показывающий состоятельность алгоритма и ускорение получения результата при применении параллельных вычислений.