我正在使用这个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);
但当然没有足够的记忆;
有什么建议吗?
答案 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次并存储结果。
就你而言,你必须分叉源代码并修改方法的调用,以便根据需要进行调整。