Нужен алгоритм распределения произвольного количества элементов по массивам.
Например, есть 3 элемента: 0, 1, 2.
Нужно найти все варианты распределения по массивам
Варианты могут быть следующие:
Вариант 1:
Массив 1(0 ,1, 2)
Вариант 2:
Массив 1(0, 1)
Массив 2(2)
Вариант 3:
Массив 1(0, 2)
Массив 2(1)
Вариант 4:
Массив 1(1, 2)
Массив 2(0)
Вариант 5:
Массив 1(0)
Массив 2(1)
Массив 3(2).
Количество элементов может быть любым. Необходимо найти все варианты, но порядок как внутри массива, так и порядок массивов не важен. То есть вариант, в котором есть Массив 1(0) и Массив 2(2, 1), будет являться дублем варианта 4.
На выходе ожидается:
один МассивРезультат, каждый элемент которого это МассивВариант, каждый элемент которого это МассивВарианта (или список значений, не так важно), каждый элемент которого это Элемент.
Всем спасибо, решение найдено. Получился универсальный алгоритм с нефиксированным количеством элементов. Безусловно, чем больше элементов, тем значительно дольше идет процесс. Но он идет, и на выходе получается нужный массив вариантов. Внутри алгоритма использовалась функция https://infostart.ru/1c/articles/365025/ как вспомогательная.
(20) Давайте не будем опускаться до сексизма) Во-первых, "хотелка" вовсе не моя, а пользователя. Соответственно, где и как будет "такое" храниться не моя и не ваша проблема. Стояла задача (осознанная) написать алгоритм, а не оправдать неспособность это сделать доказательствами нецелесообразности метода.
Нужно перебрать все возможные варианты разбития исходного количество элементов на группы, а потом для каждой группы применить алгоритм поиска сочетаний, как в https://infostart.ru/public/240261.
Пусть у нас N элементов.
Тогда группы будут (буду обозначать их количеством элементов):
N
1, N-1
2, N-2
...
N-1, 1
1, 1, N-2
1, 2, N-3
...
1, N-2, 1
2, 1 N-3
...
2, N-3, 1
и так далее, пока не дойдём до группы 1, 1, 1 ... 1 (N массивов по одному элементу)
-------
Можно попробовать пойти обратным путём:
Возьмём начальное разбиение на N массивов по одному элементу в каждом: 1, 1, 1, ... 1
Будем брать один элемент массива #1 и по очереди добавлять в каждый другой массив:
2, 1, 1, ... 1
1, 2, 1, ... 1
...
1, 1, 1, ... 2
Потом так же сделаем для элемента массива #2, потом #3 и так до N.
На следующем шаге из каждого варианта мы будем генерировать новый вариант по этому же принципу.
-------
В любом случае, количество вариантов будет расти по экспоненте.
Если порядок в массивах не важен и порядок самих массивов не важен, то для 4-х элементов получается 5 различных вариантов разбиения на массивы и всего 15 вариантов распределения:
(15) попробовал прикинуть количество вариантов в зависимости от числа элементов и сравнил это с 2^n
1: 1 -> 2^1 = 2
2: 2 -> 2^2 = 4
3: 5 -> 2^3 = 8
4: 15 -> 2^4 = 16
5: 67 -> 2^5 = 32
6: 297 -> 2^6 = 64
Допустим даже, что мы ограничимся 2^n.
Если взять, например, 40 элементов, то количество комбинаций будет 2^40, а это примерно 10^12. Каждая комбинация содержит 40 цифр = 40 байт. Значит в памяти это будет занимать 10^12 * 40 байт = 44 терабайта.
Где и как вы будете такое хранить?
Даже если написать алгоритм, который будет такое считать, как вы будете им пользоваться? Где хранить результат вычислений? Без дополнительных ограничений что-то дельное сделать вряд ли получится.
Как вариант, если хотя бы примерно известно количество элементов в массиве и количество массивов, то можно в цикле с фиксированным количеством итераций можно заполнить таблицу элементами массивов и свернуть.
Всем спасибо, решение найдено. Получился универсальный алгоритм с нефиксированным количеством элементов. Безусловно, чем больше элементов, тем значительно дольше идет процесс. Но он идет, и на выходе получается нужный массив вариантов. Внутри алгоритма использовалась функция https://infostart.ru/1c/articles/365025/ как вспомогательная.