我有一个列表[aa','b','c','d']
我们可以把每个字母想象成一个玩家。目标是培养出所有可能的3人团队。在这种情况下,所需输出将是…
['a', 'b', 'c']
['a', 'b', 'd']
['a', 'c', 'd']
['b', 'c', 'd']
至少我认为这是所有可能的组合,如果我错了,请纠正我。
我写了这篇文章,但没有产生所需的输入。如果我去掉data[j+1]
行,并期望2人而不是3人的团队得到结果,那么它会起作用,这很有趣。
for(let i = 0; i < data.length; i++){
for(let j = i + 1; j < data.length; j++){
team = [data[i], data[j], data[j+1]]
}
}
如何产生所需的输出
以下是从字符串数组中查找组合的递归方法。
function uniqueCombinations(names, groupSize = 3, index = 0, current = []) {
if (current.length === groupSize) return [current];
if (index === names.length) return [];
return uniqueCombinations(names, groupSize, index + 1, current.concat(names[index]))
.concat(uniqueCombinations(names, groupSize, index + 1, current));
}
const names = ['Arlong', 'Blackbeard', 'Chopper', 'Doma', 'Eman'];
const result = uniqueCombinations(names);
console.log( { result, length: result.length } );
只需添加第三个循环层。
function allTeamsOf3(arr) {
let res = [];
for (let i = 0; i < arr.length; i++)
for (let j = i + 1; j < arr.length; j++)
for (let k = j + 1; k < arr.length; k++)
res.push([arr[i], arr[j], arr[k]]);
return res;
}
console.log(allTeamsOf3(['a', 'b', 'c', 'd']));
递归可以用于更通用的解决方案。
function allTeams(arr, size) {
let res = [];
function helper(curr, i) {
if (curr.length === size) res.push([...curr]);
else if (i < arr.length) {
helper(curr.concat(arr[i]), i + 1);
helper(curr, i + 1);
}
}
helper([], 0);
return res;
}
console.log(allTeams(['a', 'b', 'c', 'd'], 3));
好吧,如果学习者想了解更多,我只是想用一种更数学的方式来解释它。
假设您的";组合";不会重复。我们知道解的个数严格地是nCr
。其中n
是集合的大小,r
是子集的大小。
在数学中,我们可以将其成组呈现。对于一个随机集,我可以组成rn0 1 2 3 4 5 6 7
:)
我们想要的是避免重复组合。其中一个简单的方法是通过排序算法。
例如,对于大小为3的子集。我们已经得到CCD_ 6。下一轮将是0 2 (3/4/5/6/7)
选择集合CCD_ 8大于最后选择的CCD_。因此,它消除了获得0 2 1
的机会
只要您将数据集保存在order
中(根据您的决定排序),您几乎可以使用任何技术(递归、循环,甚至重复推送和弹出容器)来解决它。这些家伙展示了一些递归实现的问题。
或者。。。
关于更难的数学方法……我不是100%确定如何做。但我认为分享会很有趣。
请注意,元素的存在可以被视为二进制状态。使0 1 2 3 4 5 6 7
成为11111111
。则CCD_ 14将是CCD_。
这使得有可能具有映射功能。有了输入n r i
,我们就能找到递归中给出的i th
组合。
我建议这样做的原因是。。。CCD_ 18可呈指数级增长。有了n=100,r=50
,你已经有了一个超级大的数字。这并没有多大帮助。
有了这个映射函数(可能使用hash?),您可以将100C50
组合与。。。数组大小为"0";100〃;,a";搜索";具有100个比特的比特集。好极了