Мне нужно вычислить и получить все перестановки для большого числа. Как массив, содержащий 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));
}
}
Может кто-то пожалуйста, дайте мне знать, могу ли я быть в состоянии решить, если хранить их в базе данных и расчета.
PS: Есть еще один эффективный код, который я могу использовать при поиске 13! значений перестановок.
Какое исключение вы получили? У меня есть догадка, что есть больше перестановок из 13-значного числа, чем может содержать массив. – chessofnerd
Это исключение OutOfMemoryError. – 2014-09-26 05:04:09
, потому что у вас нет базового футляра, и вы используете рекурсию. –