计算二项式系数的时间限制超过(Pascal三角形)

时间:2017-05-07 07:14:50

标签: java pascals-triangle

问题是计算不能被给定素数整除的二项式系数的数量。例如: -

  

对于num = 5和prime = 5,输出应为:   countingBinomialCoefficient(num,prime)= 17

     

N = 0:[1]

     

N = 1:[1,1]

     

N = 2:[1,2,1]

     

N = 3:[1,3,3,1]

     

N = 4:[1,4,6,4,1]

     

N = 5:[1,5,10,10,5,1]

在上面的示例中,只有 5,10,10,5 只能从 21 数字中分割出来。因此输出 17

我写的代码如下:

long countingBinomialCoefficient(int num, int prime) {
  long count = 0;
  for (int i = 0; i <= num; i++) {
     long nCk = 1;
     for (int j = 0; j <= i; j++) {
        if(nCk % prime != 0) count++; 
        nCk = nCk * (i-j) / (j+1);
     }
   }
  return count;
}

这两种情况的正确输出:
1。 countingBinomialCoefficient(5,5) = 17

2。 countingBinomialCoefficient(5,7) = 21

但是它表示在时间限制(= 3000毫秒) countingBinomialCoefficient (999999999,7),在这种情况下输出应 2129970655314432
我的代码中有错误吗?还有其他更短的方法吗?请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:0)

为了减少这段代码的计算时间,你可以先用一个parallel替换外层循环。这可以将时间缩短一半或更多。

为了进一步减少时间,您可以通过划分计算的行范围并对结果求和来在不同机器之间共享计算。

static long countingBinomialCoefficient(int num, int prime) {
    return IntStream.rangeClosed(0, num)
            .parallel()
            .mapToLong(i -> {
                long count = 0;
                long nCk = 1;
                for (int j = 0; j <= i; j++) {
                    if (nCk % prime != 0) count++;
                    nCk = nCk * (i - j) / (j + 1);
                }
                return count;
            }).sum();
}
// test failed in my case on one computer
public static void main(String[] args) {
    long time = System.currentTimeMillis();
    System.out.println(countingBinomialCoefficient(99999, 7)); // 2214367021
    System.out.println(System.currentTimeMillis() - time); // 24941
}

另见:Parallelized Matrix Multiplication