큰 수의 모든 순열을 계산하고 얻어야합니다. 13 개의 숫자가 들어있는 배열과 같습니다. 하지만 인터넷에서 발견 한 코드는 10 개의 값으로 작동했지만 13 개의 숫자로는 예외가 발생하여 작동하지 않습니다. 메모리가 총 순열을 보여주기에 충분하지 않다고합니다. 순열을 인쇄 할 필요가 없습니다. 나를 데이터베이스에 저장하는 것은 완벽 할 것이다. 데이터베이스에 직접 저장하면 계산을 수행 할 수 없습니다. 나는 인터넷에서 이것에 대한 적절한 대답을 찾을 수 없었다.많은 수의 순열을 데이터베이스에 저장하기
이것은 순열을 계산하는 데 사용 된 코드입니다.
공용 클래스 PermutationCalc는 {
/**
* @param args the command line arguments
*/
static <E> String arrayToString(E[] arr) {
final StringBuffer str = new StringBuffer();
for (E e : arr){
str.append(e.toString());
}
return str.toString();
}
static <E> ArrayList<E[]> permutations(E[] arr) {
final ArrayList<E[]> resultList = new ArrayList<E[]>();
final int l = arr.length;
if (l == 0) return resultList;
if (l == 1)
{
resultList.add(arr);
return resultList;
}
E[] subClone = Arrays.copyOf(arr, l - 1);
System.arraycopy(arr, 1, subClone, 0, l - 1);
for (int i = 0; i < l; ++i){
E e = arr[i];
if (i > 0) subClone[i-1] = arr[0];
final ArrayList<E[]> subPermutations = permutations(subClone);
for (E[] sc : subPermutations)
{
E[] clone = Arrays.copyOf(arr, l);
clone[0] = e;
System.arraycopy(sc, 0, clone, 1, l - 1);
resultList.add(clone);
}
if (i > 0) subClone[i-1] = e;
}
return resultList;
}
static ArrayList<String> permutations(String arr) {
final Character[] c = new Character[arr.length()];
for (int i = 0; i < arr.length(); ++i)
c[i] = arr.charAt(i);
final ArrayList<Character[]> perms = permutations(c);
final ArrayList<String> resultList = new ArrayList<String>(perms.size());
for (Character[] p : perms)
{
resultList.add(arrayToString(p));
}
return resultList;
}
public static void main(String[] args) {
//ArrayList<String> str_perms = permutations("abc");
//for (String p : str_perms) System.out.println(p);
ArrayList<Integer[]> int_perms = permutations(new Integer[]{ 1, 2, 3,4,5,6,7,8,9,10});
System.gc();
for (Integer[] p : int_perms) System.out.println(arrayToString(p));
}
}
누군가 날 나는 데이터베이스에 저장하고 계산하는 경우를 해결할 수있을 것입니다 여부를 알려 주시기 바랍니다 수 있습니다.
추신 : 13 개를 찾는 데 사용할 수있는 또 다른 효율적인 코드가 있습니까? 순열 값의 그것은이 코드에 보인다
예외는 무엇입니까? 나는 배열이 가질 수있는 것보다 13 자리수의 순열이 더 많다는 직감이있다. – chessofnerd
OutOfMemoryError 예외입니다. –
왜냐하면 기본 케이스가없고 재귀를 사용하기 때문입니다. –