什么是一种有效的方法来查找从N个礼物中选择礼物的数量,其中N可以非常大(N~10 ^ 18)。那就是我们必须计算N(C)K或N选择K.K也可以是N的数量级。
答案 0 :(得分:5)
我想没有快速计算如此大数字的方法。您可以使用Stirling's formula
来估算它答案 1 :(得分:3)
C(n, k)
的值可能接近2^n
。 (好,数量级更小,但这里并不重要)。
存储号码2^(10^18)
的重要性是什么,您需要10^18
位或~ 10^17
字节。
您可能希望调整问题定义,因为没有类似的计算机。
其他人已经指出了近似公式,你可以将结果存储为浮点数,因此不会花费超过必要的内存。
答案 2 :(得分:3)
k ~ n / 3
或k ~ log n
等进一步的渐近信息时,斯特林的公式才有用。由于没有关于您的具体问题的进一步信息,您不会得到斯特林公式的任何信息。
对于你所说的问题,当k和n很大时(即使它们不大)计算C(n,k)的最直接方法是使用
log C(n, k) = log (n!) - (log (k!) + log ((n - k)!))
和
n! = gamma(n + 1).
事实是,实现log gamma非常容易,然后你有
C(n, k) = exp (f(n + 1) - f(k + 1) - f(n - k + 1))
其中f = log gamma
。
您可以在 Numerical Recipes 中找到用于计算日志伽玛的数值算法,旧版本可用there,您将在第6章找到示例实现。
答案 3 :(得分:3)
由于多样性是生活的调味品,另一种方法如下。价值
(N选择K)/ 2 ^ N接近具有平均N / 2和标准偏差Sqrt [N] / 2的正态分布,并且它非常快速地完成。因此,我们可以近似(N选择K)
2 ^ N * Normdist(x,0,1)/ std其中x =(k - N / 2)/ std和std是Sqrt [N] / 2.
Normdist(x,0,1)= Exp(-x ^ 2/2)* 1 /(Sqrt(2 * Pi))
就误差而言,数量越大越好,使用N作为113(?)的快速检查显示最大误差为最大系数的百分比小于0.3%。
没有声称它比使用斯特林公式更好,但认为它可能会避免一些n ^ n计算并计算出这些系数的对数是一个非常简单的计算。