Binomial Coefficient(二项式系数)

简介:

In mathematics, any of the positive integers that occurs as a coefficient in the binomial theorem is a binomial coefficient. Commonly, a binomial coefficient is indexed by a pair of integers n ≥ k ≥ 0 and is written {\displaystyle {\tbinom {n}{k}}.} {\displaystyle {\tbinom {n}{k}}.} It is the coefficient of the xk term in the polynomial expansion of the binomial power (1 + x)n, and it is given by the formula.

英文描述

英文描述请参考下面的图。

中文描述

根据给定的公式计算二项式的值。

在这里有一个说明需要注意的是,如果结果超过 1,000,000,000 你的程序应该返回 -1。

如果结果没有定义的话,那么你的程序应该也要返回 -1。

思路和点评

在这里的计算,公式比较简单,就是计算 N,K N-K 的阶乘,在阶乘中,你可以使用递归进行计算。

但是需要注意的是对这个数字的阶乘计算量,程序是很容易溢出的,如果从出题者的意图来看就是要考察大数值的计算和计算中的溢出。

如果你使用的是 Java 的话,你应该使用类 BigDecimal,进行计算。如果你可以使用 Apache Common Math 的话,你就直接使用 CombinatoricsUtils.factorialDouble 进行计算。在计算中允许的最大参数值为 170,超过这个值以后就超过程序能够计算的最大值了。

如果你希望直接计算二项式系数的话,你可以使用 CombinatoricsUtils.binomialCoefficientDouble(40, 20) 直接进行计算。

源代码

源代码和有关代码的更新请访问 GitHub:

https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/WayfairTest.java

测试类请参考:

https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/WayfairTest.java

代码思路请参考:


	/**
	 * https://www.cwiki.us/display/ITCLASSIFICATION/Binomial+Coefficient
	 * 
	 * Binomial Coefficient
	 */
	@Test
	public void testBinomialCoefficient() {
		int n = 40;
		int k = 20;

		BigDecimal bc = factorial(n).divide(factorial(k).multiply(factorial(n - k)));
		// a.compareTo(new BigDecimal(1000000000))
		logger.debug("{}", bc);
		logger.debug("Check for Compare To - [{}]", bc.compareTo(new BigDecimal(1000000000)));
		logger.debug("Value - [{}]", bc);

		logger.debug("Apache CombinatoricsUtils Factorial - [{}]", CombinatoricsUtils.factorialDouble(20));
		logger.debug("Apache CombinatoricsUtils Binomial Coefficient - [{}]", CombinatoricsUtils.binomialCoefficientDouble(40, 20));

	}

	/**
	 * for factorial
	 * 
	 * @param x
	 * @return
	 */
	private static BigDecimal factorial(int x) {
		if (x == 1 || x == 0) {
			return BigDecimal.valueOf(1);
		} else {
			return BigDecimal.valueOf(x).multiply(factorial(x - 1));
		}
	}


 

测试结果

上面程序的测试结果如下:

2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - 137846528820
2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - Check for Compare To - [1]
2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - Value - [137846528820]
2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - Apache CombinatoricsUtils Factorial - [2.43290200817664E18]
2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - Apache CombinatoricsUtils Binomial Coefficient - [1.3784652882E11]

 

目录
相关文章
|
6月前
|
机器学习/深度学习 数据采集 人工智能
算法金 | 协方差、方差、标准差、协方差矩阵
**摘要:** 本文介绍了统计学中的基础概念,包括方差、标准差、协方差及其矩阵。方差衡量数据的分散程度,标准差是方差的平方根,提供相同单位下的波动度量。协方差则分析两个变量的关联性,正负值表示正负相关。协方差矩阵扩展到多变量情况,展示多个变量间的关系。这些工具在金融、质量控制、机器学习等领域有广泛应用。文章通过实例和公式清晰解释了每个概念,并强调理解它们之间的关系对于数据分析和统计建模的重要性。
82 0
算法金 | 协方差、方差、标准差、协方差矩阵
|
机器学习/深度学习 算法
24 正态分布和最大熵
24 正态分布和最大熵
98 0
L5-参数估计:矩估计与极大似然估计
L5-参数估计:矩估计与极大似然估计
L5-参数估计:矩估计与极大似然估计
|
移动开发
概率与信息论:期望、方差、标准差和协方差
概率与信息论:期望、方差、标准差和协方差
224 0
|
C++
202104-2邻域均值
202104-2邻域均值
81 0
 202104-2邻域均值
数值积分的梯形逼近及误差分析
数值积分的梯形逼近及误差分析 引入梯形逼近的原因是,在求解一些函数的反导数时候,过程极为复杂甚至可能就不可能有简单的数学表达式,那么就需要把函数f的积分切成n个连续的小梯形,计算这n个连续的小梯形的黎曼和,从而得到积分。
2199 0

热门文章

最新文章