Arrays 利用一维数组设计二项式系数算法

Arrays 利用一维数组设计二项式系数算法,arrays,algorithm,pascals-triangle,binomial-coefficients,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

我已经设计了以下使用二维数组确定二项式系数的算法。例如,要计算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?
      }
   }
}

我应该如何处理这个问题?

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

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];
    }
}

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

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

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];
    }
}

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

这是nCr,可以使用因子计算,可以使用循环或递归实现,但它们不是常数-time@Dave问题是修改第一个算法,使其只使用一个一维数组,我不认为阶乘是他们想要的?有没有另一种方法可以解决这个问题呢?这就是nCr,它可以通过使用循环或递归实现的阶乘来计算,但它们不是常数-time@Dave问题是修改第一个算法,使其只使用一个一维数组,我不认为阶乘是他们想要的?还有别的办法解决吗?谢谢!我甚至没有想过从k向下迭代,但这非常有意义,因为我们在替换之前可以访问以前的值。谢谢!我甚至没有想过从k向下迭代,但这非常有意义,因为我们在替换之前可以访问以前的值。