当前位置:首页 > JavaScript

js实现组合

2026-02-01 08:45:56JavaScript

组合问题的基本概念

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

递归实现组合

递归是解决组合问题的经典方法,通过逐步缩小问题规模并合并结果:

js实现组合

function combinations(arr, k) {
  if (k === 0) return [[]];
  if (arr.length === 0) return [];

  const first = arr[0];
  const rest = arr.slice(1);

  const withFirst = combinations(rest, k - 1).map(comb => [first, ...comb]);
  const withoutFirst = combinations(rest, k);

  return [...withFirst, ...withoutFirst];
}

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

迭代实现组合

使用位运算可以迭代生成所有可能的组合:

function combinationsIterative(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) {
    count += num & 1;
    num >>= 1;
  }
  return count;
}

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

使用生成器实现组合

ES6 生成器可以惰性地生成组合,节省内存:

js实现组合

function* combinationsGenerator(arr, k, start = 0, current = []) {
  if (current.length === k) {
    yield [...current];
    return;
  }

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

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

处理大型数据集的优化

对于大型数据集,可以采用剪枝策略优化递归:

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

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

    const maxRemaining = arr.length - (k - path.length) + 1;
    for (let i = start; i < maxRemaining; i++) {
      path.push(arr[i]);
      backtrack(i + 1, path);
      path.pop();
    }
  }

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

实际应用示例

从颜色列表中生成所有可能的双色组合:

const colors = ['red', 'green', 'blue', 'yellow'];
const colorPairs = combinations(colors, 2);

console.log(colorPairs);
// 输出: [['red', 'green'], ['red', 'blue'], ..., ['blue', 'yellow']]

这些方法覆盖了从基础到进阶的组合生成需求,可以根据具体场景选择最适合的实现方式。递归方法直观但可能堆栈溢出,迭代方法适合确定性问题,生成器适合流式处理大数据集。

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

相关文章

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(…

vue实现组合查询

vue实现组合查询

Vue 实现组合查询 组合查询通常指用户通过多个条件筛选数据,Vue 可以通过数据绑定、计算属性和方法实现这一功能。以下是具体实现方式: 数据绑定与表单设计 在 Vue 组件的 data 中定义查…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Im…