-1

Это код, который я получил из Интернета. Оптимизированный код перестановки в Java

Когда я попытался выполнить его, потребовалось много времени для элементов подсчета 7. Но когда я пробовал 14, я получил ниже исключения.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:2219) 
    at java.util.ArrayList.toArray(ArrayList.java:329) 
    at java.util.ArrayList.addAll(ArrayList.java:530) 
    at Test.permute(Test.java:45) 
    at Test.permute(Test.java:41) 
    at Test.permute(Test.java:41) 
    at Test.permute(Test.java:41) 
    at Test.main(Test.java:18) 
Java Result: 1 

Моя конфигурация системы - это 3-й генератор i5, 8 ГБ оперативной памяти. Во время работы программы потребление процессора составляло 98-100%.

Так что мой вопрос:

  • Есть ли банки для делать перестановку эффективно?
  • Что я могу сделать в этом коде для повышения производительности?

Мое требование:

  • Нужно переставить группу (т.е. более 30) целочисленных значений.

Downvoters пожалуйста прокомментируйте причине

+0

Не могли бы вы быть более конкретными в своем заявлении о проблемах? Что вы переставляете? – Zyerah

+0

Я отредактировал вопрос, включая мою потребность. – Maximin

+0

Когда вы говорите «переставить», нужно ли сортировать элементы? – Padrus

ответ

3

Вместо генерации всех перестановок первой (как это имеет экспоненциально растущий объем памяти, требуемый) Я предлагаю вам обрабатывать каждую перестановку, как вы его генерации. Это означает, что вам нужно хранить только одну комбинацию за раз.

Вы можете сгенерировать все перестановки размером 1 (или ноль, если это разрешено) и вырасти до всех перестановок всех размеров.

Примечание: для вашего вывода вам нужно только вычислить число, которое вы бы сгенерировали, вам не нужно их генерировать.

+0

Так что редактирования этого кода будет достаточно? Существуют ли какие-либо банки для эффективной перестановки? – Maximin

+0

Может быть, но учитывая, что это всего лишь упражнение, я подозреваю, что вы учитесь больше, делая это самостоятельно. Это всего лишь несколько строк кода. –

+0

Да, конечно! Благодарю. – Maximin

1

Вы можете увеличить размер кучи немного: в Eclipse, или от command line.

Однако, если вы хотите всех перестановок 30 элементов, вы будете нуждаться в 30! * 30 * 4 байтах памяти, что 3e + 22 TB ...

0

Я думаю, может быть, есть точка пропускается здесь. Вы продолжаете спрашивать, есть ли более «эффективный» или «оптимизированный» способ найти все перестановки набора чисел.

Число возможных перестановок для 30 целых чисел - это число с примерно 32 цифрами. Один гигабайт RAM - это количество байтов с 10 цифрами. Если вы говорите об одновременном хранении ВСЕ ответов на эту проблему в памяти, , то можно предположить, что вы не могли этого сделать, даже если бы у вас буквально была вся оперативная память во всем мире.

Ответ Петра признает это, заявив, что, хотя невозможно хранить полное решение для> 30 номеров, (не говоря уже о времени для его расчета), можно рассчитать часть ответа и сгенерировать больше как необходимо.

Смежные вопросы