【问题标题】:Javascript combinations sum [duplicate]Javascript组合总和[重复]
【发布时间】:2020-08-09 06:36:20
【问题描述】:

我正在尝试在 Javascript 中实现某种数学组合,但可以找到最好的方法。

我想要实现的是从 N 中找到组合的总和(由 3 个元素组成)。

例如,我怎样才能找到由 5 个元素中的 3 个组成的所有可能组合的总和?

手动显示如下:

选择:A、B、C、D、E - 都是数字

所有可能的 5 个组合中的 3 个如下:

ABC ABD ABE ACD ACE ADE BCD BCE BDE CDE

ABC 表示A * B * C

组合的简化形式如下所示:

AB(C+D+E) + AC(D+E) + ADE + BC(D+E) + BDE + CDE。

我尝试了以下代码,但没有成功:

function calc(arr) {
  var total = 0;
  for (let i = 0; i < arr.length; i++) {
    let sum = 0;
    for (let j = i + 1; j < arr.length; j++) {
      sum += arr[j] + arr[j + 1] + arr[j + 2];
    }
    total += sum * arr[i] + arr[i + 1] + arr[i + 2];
  }
  return total;
}

var arr = [2, 3, 4, 5, 6];
console.log(calc(arr));

【问题讨论】:

  • 您昨天询问了same question,它已关闭。副本提到如何从长度为 n 的数组创建大小为 k 的子集。找到子集后,将子集中的项目相乘并对所有子集求和。您还没有努力在代码中实现组合部分。

标签: javascript combinations


【解决方案1】:
function calc(arr){
    var total = 0;
    //first iterate over first possible coefficient
    for(var i = 0; i < arr.length - 2; i++){
    var coeff1 = arr[i];
    //then iterate over second possible coefficient
    for(var j = i + 1; j < arr.length - 1; j++){
      var coeff2 = arr[j];
      var parentheticalSum = 0;
      //all other values are summed and then made the third coefficient
      for(var k = j + 1; k < arr.length; k++){
        parentheticalSum += arr[k];
      }
      total += coeff1 * coeff2 * parentheticalSum;
    }
  }
  return total;
}

console.log(calc([1,2,3,4,5])); //outputs 225
// 1*2*(3+4+5) + 1*3*(4+5) + 1*4*(5) + 2*3*(4+5) + 2*4*(5) + 3*4*(5) = 225

上述方法确实有效,但绝对可以优化。我突然想到的是,我们正在做很多重复求和,我们应该用一个反向累积求和表替换第三个循环。

优化如下:

function calc(arr){
  var reverseCumSumLookup = [];
  var reverseCumSum = 0;
  for(var rev = arr.length - 1; rev >= 0; rev--){
    reverseCumSum += arr[rev];
    reverseCumSumLookup[rev] = reverseCumSum;
  }
  var total = 0;
  for(var i = 0; i < arr.length - 2; i++){
    var coeff1 = arr[i];
    for(var j = i + 1; j < arr.length - 1; j++){
      var coeff2 = arr[j];
      var parentheticalSum = reverseCumSumLookup[j+1];
      total += coeff1 * coeff2 * parentheticalSum;
    }
  }
  return total;
}

这将复杂度从 n^3 提高到 n^2。有没有可能做得比这更好?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多