为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

月关宝盒 2019-08-19 16:31:15
找到阵列中所有可能的子集组合?我需要获得一个数组的所有可能子集,其中包含最少2个项目和未知最大值。有人可以帮我一点吗?说我有这个......[1,2,3]......我怎么得到这个?[     [1,2]     , [1,3]     , [2,3]     , [1,2,3]]
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

通过这个问题的小调整,我希望我的解决方案更有效,因为它使用位运算符来生成所有子集。

var sets = (function(input, size) {
    var results = [], result, mask, i, total = Math.pow(2, input.length);
    for (mask = size; mask < total; mask++) {
        result = [];
        i = input.length - 1;

        do {
            if ((mask & (1 << i)) !== 0) {
                result.push(input[i]);
            }
        } while (i--);

        if (result.length >= size) {
            results.push(result);
        }
    }

    return results; })(['a','b','c','d','e','f'], 2);console.log(sets);


查看完整回答
反对 回复 2019-08-19
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

以下是使用ECMAScript 2015 生成器函数查找所有组合的方法:

function* generateCombinations(arr) {
  function* doGenerateCombinations(offset, combo) {
    yield combo;
    for (let i = offset; i < arr.length; i++) {
      yield* doGenerateCombinations(i + 1, combo.concat(arr[i]));
    }
  }
  yield* doGenerateCombinations(0, []);}for (let combo of generateCombinations([1, 2, 3, 4, 5])) {
  console.log(JSON.stringify(combo));}

要限制问题中要求的最小尺寸,只需确保组合的长度,然后再产生它:

function* generateCombinations(arr, minSize) {
  function* doGenerateCombinations(offset, combo) {
    if (combo.length >= minSize) {
      yield combo;
    }
    for (let i = offset; i < arr.length; i++) {
      yield* doGenerateCombinations(i + 1, combo.concat(arr[i]));
    }
  }
  yield* doGenerateCombinations(0, []);}for (let combo of generateCombinations([1, 2, 3, 4, 5], 2)) {
  console.log(JSON.stringify(combo));}

限制点yield允许以可读方式使该功能适应其他常见用例,例如,选择精确大小的所有组合:

function* generateCombinations(arr, size) {
  function* doGenerateCombinations(offset, combo) {
    if (combo.length == size) {
      yield combo;
    } else {
      for (let i = offset; i < arr.length; i++) {
        yield* doGenerateCombinations(i + 1, combo.concat(arr[i]));
      }
    }
  }
  yield* doGenerateCombinations(0, []);}for (let combo of generateCombinations([1, 2, 3, 4, 5], 2)) {
  console.log(JSON.stringify(combo));}



查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 381 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信