Учитывая мощность набора 1, 2, 3
, я получаю 8 подмножеств: []
, [1]
, [2]
, [2,1]
, [3]
, [3,1]
, [3,2]
, [3,2,1]
. Затем я хотел бы сгенерировать подмножества этого нового набора, которые имеют ровно 1 исходного набора.
Количество подмножеств в powerset моего powerset равно 256, но есть только 8, которые содержат только 1 каждый из "1", "2" и "3", это:
[
[
[1,2,3]
],
[
[2,3],[1]
],
[
[2],[1,3]
],
[
[3],[1,2]
],
[
[3],[2],[1]
],
[
[],[2],[1,3]
],
[
[],[3],[1,2]
],
[
[],[3],[2],[1]
]
]
Есть ли способ, которым я могу получить этот окончательный набор без генерации второго блока питания с 256 подмножествами? Я ищу способ, который можно масштабировать до уровня, где первый набор из 3 может иметь более 10 элементов, поэтому неэффективно рассчитывать второй набор мощности. Обратите внимание, что я на самом деле не требую случаев, когда есть пустой массив. Мой идеальный ответ будет включать только первые 5 элементов. Возможно, я толкнул себя не в ту кроличью нору, сосредоточившись на powersets. Он решил мои проблемы для n = 7, но не масштабируется до n = 14.
Это функция, которая у меня есть в настоящее время, но она падает, когда в массиве 5 элементов. Я, вероятно, подхожу к этому с неправильной стороны.
function getPowerset(arr) {
return (function ps(list) {
if (list.length === 0) {
return [
[]
];
}
const head = list.pop();
const tail = ps(list);
return [...tail, ...tail.map((e) => [head, ...e])];
})([...arr]).filter(x => x.length);
}
function getCombinationsOfSet(arr) {
const subsets = getPowerset(arr);
const subsetsOfSubsets = getPowerset(subsets);
return subsetsOfSubsets.filter((subset) => {
const flattened = subset.flat();
if (flattened.length !== arr.length) {
return false;
}
let tempArr = [...arr];
for (let part of flattened) {
const index = tempArr.indexOf(part);
if (index === -1) {
return false;
}
tempArr.splice(index, 1);
}
return true;
})
}
console.time('time-taken');
console.log(getCombinationsOfSet([1, 2, 3]));
console.timeEnd('time-taken');