gpt4 book ai didi

javascript - 给定一个数组,如何生成子集大小为 k 的所有组合?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:10:53 26 4
gpt4 key购买 nike

因此给定 input = [1, 2, 3]k=2 这将返回:

1 2
1 3
2 1
2 3
3 1
3 2

这是最接近我正在寻找的,但不完全是:http://algorithms.tutorialhorizon.com/print-all-combinations-of-subset-of-size-k-from-given-array/

function subsetsOfSize(a, used, startIndex, currentSize, k) {
if (currentSize === k) {
for (var i = 0; i < a.length; i++) {
if (used[i])
console.log(a[i]);
}
console.log('-');
return;
}

if (startIndex === a.length)
return;

used[startIndex] = true;
subsetsOfSize(a, used, startIndex+1, currentSize+1, k);

used[startIndex] = false;
subsetsOfSize(a, used, startIndex+1, currentSize, k);
}

var input = [1,2,3];
subsetsOfSize(input, Array(input.length).fill(false), 0, 0, 2);

^ 缺少结果,例如 2 13 13 2

其次,我不确定我是否正确命名了这个问题,因为“所有大小为 k 的子集的组合”的解决方案没有给出预期的答案。

最佳答案

寻找 k 子集排列的递归解决方案(伪代码):

kSubsetPermutations(partial, set, k) {
for (each element in set) {
if (k equals 1) {
store partial + element
}
else {
make copy of set
remove element from copy of set
recurse with (partial + element, copy of set, k - 1)
}
}
}

下面是一个例子:

input: [a,b,c,d,e]
k: 3

partial = [], set = [a,b,c,d,e], k = 3
partial = [a], set = [b,c,d,e], k = 2
partial = [a,b], set = [c,d,e], k = 1 -> [a,b,c], [a,b,d], [a,b,e]
partial = [a,c], set = [b,d,e], k = 1 -> [a,c,b], [a,c,d], [a,c,e]
partial = [a,d], set = [b,c,e], k = 1 -> [a,d,b], [a,d,c], [a,d,e]
partial = [a,e], set = [b,c,d], k = 1 -> [a,e,b], [a,e,c], [a,e,d]
partial = [b], set = [a,c,d,e], k = 2
partial = [b,a], set = [c,d,e], k = 1 -> [b,a,c], [b,a,d], [b,a,e]
partial = [b,c], set = [a,d,e], k = 1 -> [b,c,a], [b,c,d], [b,c,e]
partial = [b,d], set = [a,c,e], k = 1 -> [b,d,a], [b,d,c], [b,d,e]
partial = [b,e], set = [a,c,d], k = 1 -> [b,e,a], [b,e,c], [b,e,d]
partial = [c], set = [a,b,d,e], k = 2
partial = [c,a], set = [b,d,e], k = 1 -> [c,a,b], [c,a,d], [c,a,e]
partial = [c,b], set = [a,d,e], k = 1 -> [c,b,a], [c,b,d], [c,b,e]
partial = [c,d], set = [a,b,e], k = 1 -> [c,d,a], [c,d,b], [c,d,e]
partial = [c,e], set = [a,b,d], k = 1 -> [c,e,a], [c,e,b], [c,e,d]
partial = [d], set = [a,b,c,e], k = 2
partial = [d,a], set = [b,c,e], k = 1 -> [d,a,b], [d,a,c], [d,a,e]
partial = [d,b], set = [a,c,e], k = 1 -> [d,b,a], [d,b,c], [d,b,e]
partial = [d,c], set = [a,b,e], k = 1 -> [d,c,a], [d,c,b], [d,c,e]
partial = [d,e], set = [a,b,c], k = 1 -> [d,e,a], [d,e,b], [d,e,c]
partial = [e], set = [a,b,c,d], k = 2
partial = [e,a], set = [b,c,d], k = 1 -> [e,a,b], [e,a,c], [e,a,d]
partial = [e,b], set = [a,c,d], k = 1 -> [e,b,a], [e,b,c], [e,b,d]
partial = [e,c], set = [a,b,d], k = 1 -> [e,c,a], [e,c,b], [e,c,d]
partial = [e,d], set = [a,b,c], k = 1 -> [e,d,a], [e,d,b], [e,d,c]

function kSubsetPermutations(set, k, partial) {
if (!partial) partial = []; // set default value on first call
for (var element in set) {
if (k > 1) {
var set_copy = set.slice(); // slice() creates copy of array
set_copy.splice(element, 1); // splice() removes element from array
kSubsetPermutations(set_copy, k - 1, partial.concat([set[element]]));
} // a.concat(b) appends b to copy of a
else document.write("[" + partial.concat([set[element]]) + "] ");
}
}
kSubsetPermutations([1,2,3,4,5], 3);

关于javascript - 给定一个数组,如何生成子集大小为 k 的所有组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46880094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com