我们有以下公式,用于确定C
中我们可以选择的k
组合数量n
:
我编写了一个算法,总是给出答案如果,当然,答案属于数据类型(ulong
,在我的情况下)的范围内,通过分解和在评估期间取消分子和分母的术语。
即使尝试计算C
并且如果结果太大也检测到溢出的速度非常快,那么如果我可以将n
和k
放入初步中会更好估计答案是否会大于ulong
可以容纳的函数的函数。它不一定非常准确。如果它估计给定的n
和k
不会溢出但是确实如此,那就没问题了 - 但是如果不这样做,它应该永远不会说将溢出。理想情况下,这个函数应该非常快,否则没有意义 - 我也可以尝试直接计算C并让它溢出。
我正在绘制各种n的nCk曲线作为k的函数,看我能否找到一条曲线,该曲线的增长速度至少与C(n,k)一样快,但在该范围内不会偏离太远我对(0..2 ^ 64-1)很感兴趣并且在计算上很容易评估。
我没有运气。有什么想法吗?
答案 0 :(得分:0)
如果没有看到算法的实际代码,我无法为您提供100%的解决方案,但最好的办法是开发启发式功能。通过简单地找到对于各种n值, n C r 的最终答案溢出的r
的最小值,您应该能够分析n之类的关系和n和r之间的比率( n / r ),并找到一个快速计算函数,它会让你知道是否会发生溢出regression。
我发现对于任何n < 68
,你不应该在最终答案上溢出,因为 67 C 33 = 67 C 34 ~1.42x10 19 是最大可能答案,而ulong
保持~1.84x10 19 。同样,当n > 5000
时,任何r > 5
或n-r < n-5
肯定会溢出。您可以根据自己的喜好调整这些截止值,并且对于它们之间的所有n个值,只需计算 n / r 并使用回归公式来确定它是否会溢出或不
这可能是太多的工作,但至少应该让你开始走上正确的道路。