计算组合时预测溢出

时间:2012-02-23 04:02:53

标签: range combinations combinatorics

我们有以下公式,用于确定C中我们可以选择的k组合数量n

Combinations Forumla

我编写了一个算法,总是给出答案如果,当然,答案属于数据类型(ulong,在我的情况下)的范围内,通过分解和在评估期间取消分子和分母的术语。

即使尝试计算C并且如果结果太大也检测到溢出的速度非常快,那么如果我可以将nk放入初步中会更好估计答案是否会大于ulong可以容纳的函数的函数。它不一定非常准确。如果它估计给定的nk不会溢出但是确实如此,那就没问题了 - 但是如果不这样做,它应该永远不会说溢出。理想情况下,这个函数应该非常快,否则没有意义 - 我也可以尝试直接计算C并让它溢出。

我正在绘制各种n的nCk曲线作为k的函数,看我能否找到一条曲线,该曲线的增长速度至少与C(n,k)一样快,但在该范围内不会偏离太远我对(0..2 ^ 64-1)很感兴趣并且在计算上很容易评估。

我没有运气。有什么想法吗?

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 > 5n-r < n-5肯定会溢出。您可以根据自己的喜好调整这些截止值,并且对于它们之间的所有n个值,只需计算 n / r 并使用回归公式来确定它是否会溢出或不

这可能是太多的工作,但至少应该让你开始走上正确的道路。