找到阵列中所有可能的子集组合?

找到阵列中所有可能的子集组合?

我需要获得一个数组的所有可能子集,其中包含最少2个项目和未知最大值。有人可以帮我一点吗?

说我有这个......

[1,2,3]

......我怎么得到这个?

[
    [1,2]
    , [1,3]
    , [2,3]
    , [1,2,3]]


月关宝盒
浏览 382回答 3
3回答

www说

通过这个问题的小调整,我希望我的解决方案更有效,因为它使用位运算符来生成所有子集。var&nbsp;sets&nbsp;=&nbsp;(function(input,&nbsp;size)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;results&nbsp;=&nbsp;[],&nbsp;result,&nbsp;mask,&nbsp;i,&nbsp;total&nbsp;=&nbsp;Math.pow(2,&nbsp;input.length); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(mask&nbsp;=&nbsp;size;&nbsp;mask&nbsp;<&nbsp;total;&nbsp;mask++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;[]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;input.length&nbsp;-&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((mask&nbsp;&&nbsp;(1&nbsp;<<&nbsp;i))&nbsp;!==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.push(input[i]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(i--); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(result.length&nbsp;>=&nbsp;size)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results.push(result); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;results;&nbsp;})(['a','b','c','d','e','f'],&nbsp;2);console.log(sets);

饮歌长啸

以下是使用ECMAScript 2015&nbsp;生成器函数查找所有组合的方法:function*&nbsp;generateCombinations(arr)&nbsp;{ &nbsp;&nbsp;function*&nbsp;doGenerateCombinations(offset,&nbsp;combo)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;combo; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;i&nbsp;=&nbsp;offset;&nbsp;i&nbsp;<&nbsp;arr.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield*&nbsp;doGenerateCombinations(i&nbsp;+&nbsp;1,&nbsp;combo.concat(arr[i])); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;yield*&nbsp;doGenerateCombinations(0,&nbsp;[]);}for&nbsp;(let&nbsp;combo&nbsp;of&nbsp;generateCombinations([1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5]))&nbsp;{ &nbsp;&nbsp;console.log(JSON.stringify(combo));}要限制问题中要求的最小尺寸,只需确保组合的长度,然后再产生它:function*&nbsp;generateCombinations(arr,&nbsp;minSize)&nbsp;{ &nbsp;&nbsp;function*&nbsp;doGenerateCombinations(offset,&nbsp;combo)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(combo.length&nbsp;>=&nbsp;minSize)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;combo; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;i&nbsp;=&nbsp;offset;&nbsp;i&nbsp;<&nbsp;arr.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield*&nbsp;doGenerateCombinations(i&nbsp;+&nbsp;1,&nbsp;combo.concat(arr[i])); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;yield*&nbsp;doGenerateCombinations(0,&nbsp;[]);}for&nbsp;(let&nbsp;combo&nbsp;of&nbsp;generateCombinations([1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5],&nbsp;2))&nbsp;{ &nbsp;&nbsp;console.log(JSON.stringify(combo));}限制点yield允许以可读方式使该功能适应其他常见用例,例如,选择精确大小的所有组合:function*&nbsp;generateCombinations(arr,&nbsp;size)&nbsp;{ &nbsp;&nbsp;function*&nbsp;doGenerateCombinations(offset,&nbsp;combo)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(combo.length&nbsp;==&nbsp;size)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;combo; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;i&nbsp;=&nbsp;offset;&nbsp;i&nbsp;<&nbsp;arr.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield*&nbsp;doGenerateCombinations(i&nbsp;+&nbsp;1,&nbsp;combo.concat(arr[i])); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;yield*&nbsp;doGenerateCombinations(0,&nbsp;[]);}for&nbsp;(let&nbsp;combo&nbsp;of&nbsp;generateCombinations([1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5],&nbsp;2))&nbsp;{ &nbsp;&nbsp;console.log(JSON.stringify(combo));}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript