多类别组合数的快速计算[关闭]

Posted

技术标签:

【中文标题】多类别组合数的快速计算[关闭]【英文标题】:Fast computation of multi-category number of combinations [closed] 【发布时间】:2012-02-02 05:36:05 【问题描述】:

我必须为重复对象的排列评估以下公式

n!/(r1! * r2! * r3! * ......... * rn!)

wheren <= 5001 <= ri <= 10 (总共有n个对象,其中r1与第一种相似,r2与第二种相似,以此类推,公式表示这些对象的排列数)。

为此,我需要一个高效的编码解决方案,因为在 Java 中处理大整数并不能证明对于大型案例有成效。

提前致谢。

【问题讨论】:

我天真地编码了它,通过使用 BigIntegers 和除法的正常乘法评估阶乘,但程序挂在边界情况上,这就是我需要它的原因:( :( 嗯,减少这一比例的机会很多。 我会尝试 C 库 gmp (gmplib.org)。 我被要求扩展我关于如何减少分数的建议,所以这里。由于n <= 500,很有可能构建一个大小为n 的数组。使用 Eratosthenes 的筛子查找并存储直到 n 的所有非质数的因子对。制作另一个大小为n 的表,它代表每个因子的指数。现在,迭代每个阶乘。使用筛表将每个因子分解为素因子,将分子中的阶乘的指数表递增,分母中的每个阶乘递减。没有条目最终会是负面的。 现在,使用BigInteger-type 类将未取消的因子相乘。任何时候都不需要除法运算。也没有任何分数。 【参考方案1】:

你可以在java中使用

public class Permutation

旨在解决您的一种问题。

查看此链接以获取您的reference

像这样:

private static Double calculatePermutationEntropy(List<Double> values, int baseOrder) 
 int valuesSize = values.size();
 if (baseOrder >= valuesSize + 1) 
   throw new RuntimeException("The size of the values is bigger than the order");
 

 List<String> result = new ArrayList<String>();
 // iterate over the input
 for (int i = 0; i < valuesSize - baseOrder + 1; i++) 
   List<Double> neightbors = values.subList(i, i + baseOrder);

   List<Double> orderedValues = new ArrayList<Double>(neightbors);

   String window = "";
   for (int j = 0; j < neightbors.size(); j++) 
     // add the indexes in a string representation
     window += orderedValues.indexOf(neightbors.get(j));
   
 result.add(window);
 
 // use the shannon entropy calculation to get the result
 return calculateShannonEntropy(result);

source

【讨论】:

你能解释一下你写了什么 你访问过我指定的链接吗?? 组合数问题中不应该有分数。因此没有理由使用double @Ben Viogt:我的错!!谢谢你指出..!!!

以上是关于多类别组合数的快速计算[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

组合数的计算以及组合数对p取余后结果的计算

课下作业1-利用计算机计算组合数

组合数的计算

求组合数小结

常见的求组合数的板子

JustOj 1974: 简单的事情 (组合数)