当前位置:首页 > JavaScript

js 实现组合

2026-04-06 22:13:20JavaScript

实现组合的基本概念

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

递归实现组合

递归是解决组合问题的经典方法。通过逐步构建组合,每次选择一个元素后,在剩余元素中继续选择。

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], 2)); // [[1, 2], [1, 3], [2, 3]]

迭代实现组合

迭代方法利用栈模拟递归过程,避免递归可能导致的堆栈溢出问题。

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* 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]]

处理重复元素的组合

如果输入数组包含重复元素,需要去重处理。

js 实现组合

function combinationsWithDup(arr, k) {
  arr.sort((a, b) => a - b);
  const result = [];

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

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

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

// 示例
console.log(combinationsWithDup([1, 2, 2, 3], 2)); // [[1, 2], [1, 3], [2, 2], [2, 3]]

组合的应用场景

组合算法广泛应用于排列组合问题、子集生成、密码破解、游戏开发等领域。例如在扑克游戏中计算手牌组合,或在数据分析中生成特征组合。

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

相关文章

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…