Если подумать, я не уверен, что это вообще отвечает на вопрос.
у разделить массив из n элементов для данного размера подмассивов со всеми возможными комбинациями элементов.
Например:
Массив:{1,2,3,4}
- может быть n элементов, 1 <n <100. Может иметь дубликаты.
Данный размер шаблона (только пример, может отличаться):[2 -subarrays, 2-elements]
Ожидаемый результат:
{1,2}, {3,4}
{1,3}, {2,4}
{1,4}, {2,3}
или же
{2,1}, {3,4}
{1,3}, {4,2}
{3,2}, {1,4}
и т. д. Как видите, порядок элементов в подмассивах или порядок подмассивов в наборах подмассивов не имеет значения. Это должно быть минимальное количество наборов подмассивов входного массива.
У меня есть решение ниже, но оно также включает в себя перестановки. Мне нужно оптимизировать это, чтобы вообще не генерировать никаких перестановок. JavaScript не обязателен, подойдет любой язык. Заранее благодарю за любую помощь.
function getN(n, array, subsets) {
var f,
l = array.length,
indices = [],
temp;
array = array.slice();
while (l--) {
f = factorial(l);
indices.push(Math.floor(n / f));
n %= f;
}
temp = indices.map(i => array.splice(i, 1)[0]);
return subsets
? subsets.map((i => l => temp.slice(i, i += l))(0))
: temp;
}
function factorial(num) {
var result = 1;
while (num) {
result *= num;
num--;
}
return result;
}
var i, l,
array = ['1', '2', '3', '4'],
subsets = [2, 2],
pre = document.getElementById('out');
for (i = 0, l = factorial(array.length); i < l; i++) {
pre.innerHTML += i.toString().padStart(4) +': ' + JSON.stringify(getN(i, array, subsets)) + '\n';
}
<pre id="out"></pre>