快速计算多类别组合数

时间:2012-02-02 05:36:06

标签: java c++ c combinatorics

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

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

其中n <= 5001 <= ri <= 10(总共有n个对象,其中r1与1种类似,r2与第2种类似,依此类推,公式表示排列的数量这样的对象)。

我需要一个有效的编码解决方案,因为使用Java中的大整数对于大型案例来说并不具有成效。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以使用

在java中执行此操作
public class Permutation

旨在实现一种你的问题。

请参阅此reference

的链接

OR

像这样:

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