【问题标题】:Optimizing calculating combination and avoiding overflows优化计算组合,避免溢出
【发布时间】:2012-08-26 12:24:30
【问题描述】:

我正在解决一个编程问题,该问题卡在有效地计算 nCr 并同时避免溢出。我做了以下简单的简化,但我只是好奇是否有任何更复杂的简化可用。

(n)!/(n-k)!*k! = n*(n-1)*.....*(max(n-k+1, k))/(min(n-k, k-1))

考虑到 k 的不同情况是偶数还是奇数,是否有任何进一步的简化可能,只是提出一种方法。

欢迎评论。

【问题讨论】:

  • 作为替代/补充答案,GMP 库可用于表示任意大的整数。 gmplib.org

标签: c overflow


【解决方案1】:

我在这里找到了一个有趣的解决方案:http://blog.plover.com/math/choose.html

    unsigned choose(unsigned n, unsigned k) {
      unsigned r = 1;
      unsigned d;
      if (k > n) return 0;
      for (d=1; d <= k; d++) {
        r *= n--;
        r /= d;
      }
      return r;
    }

这通过交替执行乘法和除法来避免溢出(或至少限制问题)。

例如对于n = 8k = 4

result = 1;
result *= 8;
result /= 1;
result *= 7;
result /= 2;
result *= 6;
result /= 3;
result *= 5;
result /= 4;
done

【讨论】:

  • 我理解该方法并在发布之前考虑过它,但无法证明当您在某些迭代中除以某个数字时说 x 那么为什么当时的分子必须是倍数的x。如果它不是倍数,那么我们将不会得到正确的答案。
  • @AmanDeepGautam:在循环的每次迭代中,在除法语句之后,r 的值为 nCd,对于 n 的原始值和 d 的当前值。因此,当 n 从 10 开始时,第一次迭代将 r 设置为 10 (*10 / 1)。第二次迭代将 r 设置为 45 (*9 / 2)。第三次迭代将 r 设置为 120 (*8 / 3)。这些是值 10C1、10C2 和 10C3。我们知道 nCd 总是一个整数。因此,数学除法必须始终产生一个整数,因此,在除法之前,r 必须是 d 的倍数。
  • 这仍然很快溢出。 (((((((((99 / 1) * 98) / 2) * 97) / 3) * 96) / 4) * 95) / 5) * 94 = BOOM
  • @Dici:如果溢出,那么整体结果也会溢出(假设您的k 范围仅从1n/2,这足以计算任何@987654332 的结果@)
【解决方案2】:

我也必须解决这个问题。我所做的是利用乘法与除法相同数量的事实,并将它们捆绑在一起,一次进行一次乘法和一次除法。它最后是一个整数,但我使用 double 作为中间项,然后在最后四舍五入到最接近的整数。

// Return the number of combinations of 'n choose k'
unsigned int binomial(unsigned int n, unsigned int k) {
unsigned int higher_idx;
unsigned int lower_idx;
if(k > n-k) {
    higher_idx = k;
    lower_idx = n - k;
} else {
    higher_idx = n - k;
    lower_idx = k;
}
double product = 1.0;
double factor;
unsigned int idx;
for(idx=n; idx>higher_idx; idx--) {
    factor = (double)idx / double(lower_idx - (n - idx));
    product *= factor;
}
return (unsigned int)(product + 0.5);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2012-03-13
    相关资源
    最近更新 更多