计算大数量的排列

时间:2017-04-29 14:59:50

标签: java permutation

我正在使用这个java代码来尝试计算20的排列: (这只是用于计算排列的代码部分)

int[] myArray = new int[20];
for (int i = 0; i < a; i++)
    myArray[i] = i + 1;

List<Integer> intList = new ArrayList<Integer>();
for (int index = 0; index < myArray.length; index++)
{
    intList.add(myArray[index]);
}

List<Integer> vals = intList; 

Collection<List<Integer>> orderPerm = Collections2.permutations(vals);

但当然没有足够的记忆;

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

20号大小的排列数是20因子,大约是10 ^ 18。 8千兆字节的ram大约是8 * 10 ^ 9字节,正如您可能理解的那样,远远低于存储10 ^ 18中每个可能排列所需的存储量。

答案 1 :(得分:0)

这些排列会有 2432902008176640000 http://www.calculatorsoup.com/calculators/discretemathematics/permutations.php?n=20&r=20&action=solve

如果你可以每秒输出10万个排列,那就需要 2432902008176640000 / 100000/60/60/24/365 = 771468年来做这件事

100M 每秒排列速度更快,只需 771年

答案 2 :(得分:0)

更少的内存方法将涉及按需计算固定但可管理的排列数量。因此,您需要一个像getNextPermutation()这样的方法。

我从Guava的源代码(您目前在代码中使用的那个)中找到了Collection2.java中的方法: https://github.com/google/guava/blob/master/guava/src/com/google/common/collect/Collections2.java

你有,

@Override
    protected List<E> computeNext() {
      if (nextPermutation == null) {
        return endOfData();
      }
      ImmutableList<E> next = ImmutableList.copyOf(nextPermutation);
      calculateNextPermutation();
      return next;
    }

    void calculateNextPermutation() {
      int j = findNextJ();
      if (j == -1) {
        nextPermutation = null;
        return;
      }

      int l = findNextL(j);
      Collections.swap(nextPermutation, j, l);
      int n = nextPermutation.size();
      Collections.reverse(nextPermutation.subList(j + 1, n));
}

您可以立即调用此计算,然后一次说100或1000次并存储结果。

就你而言,你必须分叉源代码并修改方法的调用,以便根据需要进行调整。