【发布时间】:2019-12-27 03:11:20
【问题描述】:
我正在使用以下递归函数计算任意大小的二项式系数
private static final BigDecimal ZERO = new BigDecimal("0");
private static final BigDecimal ONE = new BigDecimal("1");
private static BigDecimal binomial(BigDecimal n, BigDecimal k) {
if(n.equals(k) || k.equals(ZERO))
return ONE;
else if(k.compareTo(ZERO) < 0)
return ZERO;
else
return binomial(n.subtract(ONE), k).add(binomial(n.subtract(ONE), k.subtract(ONE)));
}
对于大量数据,它变得非常慢。是否有任何简单和/或明显的优化?不确定 BigDecimals 会减慢多少,但为大数创建自定义类似乎需要做很多工作。
【问题讨论】:
-
保留中间结果并使用它们,而不是每次递归时都重新计算。
-
不要重新计算已有的值,而是存储它们。
-
你读过these answers吗?它们适用于 C#,但应该很容易适应。这种递归算法本质上很慢。
-
我倾向于认为
BigInteger会比BigDecimal.更有效率
标签: java performance kotlin optimization binomial-coefficients