使用单维数组设计二项式系数算法

时间:2015-03-01 21:17:34

标签: arrays algorithm pascals-triangle binomial-coefficients

我已经设计了以下算法,该算法使用二维数组确定二项式系数。例如,要计算n的二项式系数选择k,我们可以创建一个二维数组,如下所示:

int[][] arr = new int[n][k];

我们可以通过以下方式填充数组:

for(int i = 0; i <= n; i++){
   for(int j = 0; j <= minimum(i, k); j++){
      if(j == 0 || i == j){
         arr[i, j] = 1;
      } else{
         arr[i, j] = arr[i - 1, j - 1] + arr[i - 1, j];
      }
   }
}

但是,我需要重新设计此算法以使用索引0-k的一维数组。我在查明如何做到这一点时遇到了很多麻烦。我已经开始了一小步,并意识到了一些常见现象:

  • 如果k = 0,则arr [0]将为1,无论n如何都将返回。
  • 如果k = 1,则arr [0]为1,如果我在循环中设计,则arr [1]应为n。

当我说k = 2时,这就是它变得棘手的地方,因为arr [2]的值将真正取决于之前的值。我相信当我循环(从i = 0到i = n)时,arr []的值会改变,但我不能完全理解。我从这些方面着手:

for(int i = 0; i <= n; i++){
   for(int j = 0; j <= minimum(i, k); j++){
      if(j == 0 || i == j){
         arr[j] = 1;
      } else if(j == 1){
         arr[j] = i;
      } else{
         arr[j] = ??; // I can't access previous values, because I didn't record them?
      }
   }
}

我该如何处理?

1 个答案:

答案 0 :(得分:3)

这是一个只使用一个一维数组的代码:

int[] coefficients = new int[k + 1];
coefficients[0] = 1;
for (int i = 1; i <= n; i++) {
    for (int j = k; j >= 1; j--) {
        coefficients[j] += coefficients[j - 1];
    }
}

为什么这是正确的?要计算固定coefficients[j]的{​​{1}},我们需要知道i的{​​{1}}和coefficients[j - 1]的值。如果我们从coefficients[j]迭代到i - 1,我们可以安全地为当前位置记录一个新值,因为我们永远不需要它的旧值。