当前位置:首页 > JavaScript

js 实现组合

2026-03-15 04:39:50JavaScript

组合的概念

组合是从一组元素中选取若干元素,不考虑顺序。例如从数组 [1, 2, 3] 中选取 2 个元素的组合为 [[1, 2], [1, 3], [2, 3]]

递归实现

递归是解决组合问题的常见方法。通过固定一个元素,递归处理剩余元素,逐步构建组合结果。

js 实现组合

function combinations(arr, k) {
  const result = [];

  function backtrack(start, current) {
    if (current.length === k) {
      result.push([...current]);
      return;
    }

    for (let i = start; i < arr.length; i++) {
      current.push(arr[i]);
      backtrack(i + 1, current);
      current.pop();
    }
  }

  backtrack(0, []);
  return result;
}

// 示例用法
console.log(combinations([1, 2, 3, 4], 2));
// 输出: [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]

迭代实现

使用迭代方法可以通过循环生成所有可能的组合,避免递归的调用栈问题。

js 实现组合

function combinationsIterative(arr, k) {
  const result = [];
  const stack = [{ index: 0, current: [] }];

  while (stack.length > 0) {
    const { index, current } = stack.pop();

    if (current.length === k) {
      result.push([...current]);
      continue;
    }

    for (let i = index; i < arr.length; i++) {
      current.push(arr[i]);
      stack.push({ index: i + 1, current: [...current] });
      current.pop();
    }
  }

  return result;
}

// 示例用法
console.log(combinationsIterative([1, 2, 3], 2));
// 输出: [[1, 2], [1, 3], [2, 3]]

二进制位掩码法

对于较小规模的数组,可以使用二进制位掩码生成所有可能的子集,然后筛选出符合长度的组合。

function combinationsBitmask(arr, k) {
  const result = [];
  const n = arr.length;

  for (let mask = 0; mask < (1 << n); mask++) {
    if (countSetBits(mask) !== k) continue;

    const current = [];
    for (let i = 0; i < n; i++) {
      if (mask & (1 << i)) {
        current.push(arr[i]);
      }
    }
    result.push(current);
  }

  return result;
}

function countSetBits(num) {
  let count = 0;
  while (num > 0) {
    count += num & 1;
    num >>= 1;
  }
  return count;
}

// 示例用法
console.log(combinationsBitmask([1, 2, 3], 2));
// 输出: [[1, 2], [1, 3], [2, 3]]

性能考虑

递归方法简洁但可能受调用栈限制,适合小规模数据。迭代方法更稳定,适合大规模数据。二进制位掩码法适用于非常小的数据集(通常 n ≤ 20),因为其时间复杂度为 O(2^n)。

实际应用

组合生成常用于算法问题如子集、排列组合、游戏状态遍历等场景。根据具体需求选择合适的方法,例如需要处理重复元素时需额外去重逻辑。

标签: 组合js
分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…