寻找所有可能总和的时间复杂性

时间:2018-01-09 22:51:34

标签: javascript algorithm time-complexity

这是一个算法的解决方案,希望我在给定一组硬币及其相应数量的情况下找到所有可能的总和。我很难得出这个算法的时间复杂度。任何帮助将非常感谢,谢谢!!

const coins = [1, 2, 3];
const quantity = [1, 2, 2];

const possibleSums = (coins, quantity) => {
  const uniqueSums = new Set([0]);

  for (let i = 0; i < coins.length; i++) {
    const currentSums = new Set();
    for (let j = 1; j <= quantity[i]; j++) {
      for (let sum of uniqueSums) {
        currentSums.add((coins[i] * j) + sum);
      }
    }
    for (let sum of currentSums) {
      uniqueSums.add(sum);
    }
  }

  return uniqueSums.size - 1;
}

1 个答案:

答案 0 :(得分:0)

我认为平均复杂度为O(n * m),其中n是可用硬币的总金额(即所有i的硬币[i] *数量[i]的总和),m是唯一金额的数量可能的(即你想要计算的东西)。

棘手的部分是uniqueSums的大小不会以可预测的方式增长,因为它取决于所使用的确切值,所以我无法看到一个明显的论据来证明它实际上并不是更小的东西(例如O(n + m)或类似的东西)

基本上,最好的情况是O(n)(如果uniqueSums的大部分大小来自最后一次迭代,那么它永远不必迭代),最坏的情况是O(n * m)(相反的情况,如果uniqueSums立即达到其最终大小),平均情况可能仍然是O(n * m),但我不是100%肯定。