【问题标题】:Computing large combinations计算大型组合
【发布时间】:2014-02-07 16:26:45
【问题描述】:

你将如何计算一个组合,例如(100,000 选择 50,000)?

到目前为止,我已经尝试了三种不同的方法,但由于显而易见的原因,每种方法都失败了:

1) 动态编程 - 数组的大小变得如此荒谬,以至于出现段错误

unsigned long long int grid[p+1][q+1];

//Initialise x boundary conditions
for (long int i = 0; i < q; ++i) {
  grid[p][i] = 1;
}

//Initialise y boundary conditions
for (long int i = 0; i < p; ++i) {
  grid[i][q] = 1;
}


for (long int i = p - 1; i >= 0; --i) {
  for (long int j = q - 1; j >= 0; --j) {
     grid[i][j] = grid[i+1][j] + grid[i][j+1];
   }
}

2) 蛮力 - 显然计算甚至 100!不现实

unsigned long long int factorial(long int n)
{
  return (n == 1 || n == 0) ? 1 : factorial(n - 1) * n;
}

3) 乘法公式 - 我无法存储它们太大的值

const int gridSize = 100000; //say 100,000
unsigned long long int paths = 1;

for (int i = 0; i < gridSize; i++) {
    paths *= (2 * gridSize) - i;
    paths /= i + 1;
}

// code from (http://www.mathblog.dk/project-euler-15/)

如果它有助于上下文,其目的是解决大型输入的“通过 m×n 网格有多少条路线”问题。也许我错过了解决问题?

【问题讨论】:

    标签: c++ algorithm permutation dynamic-programming combinatorics


    【解决方案1】:

    C(100000, 50000) 是一个包含 30101 个十进制数字的巨大数字:http://www.wolframalpha.com/input/?i=C%28100000%2C+50000%29

    显然unsigned long long 不足以存储它。你需要一些任意的大整数库,比如 GMP:http://en.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library

    否则,乘法公式应该足够好了。

    【讨论】:

      【解决方案2】:

      “你将如何计算……”很大程度上取决于所需的准确度。精确结果只能使用任意精度数(例如 GMP)来计算,但您很可能并不需要确切的结果。

      在这种情况下,我将使用斯特林近似法 (http://en.wikipedia.org/wiki/Stirling%27s_approximation) 并使用双精度数进行计算。展开式中的和数可用于调节误差。维基百科页面也会给你一个错误估计。

      【讨论】:

        【解决方案3】:

        这是可能有帮助的递归公式:-

        NCk = (N-1)C(k-1)*N/K

        首先对 (N-1)C(K-1) 使用递归调用,然后根据结果评估 NCk。

        由于您的数字将非常大,请使用以下替代方案之一。

        1. GMP
        2. 使用您自己的实现,您可以将数字作为二进制位序列存储在数组中,并使用 boot 算法进行乘法运算 移位和减法进行除法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-08
          • 1970-01-01
          • 1970-01-01
          • 2011-02-25
          • 1970-01-01
          • 2021-11-07
          相关资源
          最近更新 更多