Я пытаюсь решить project Euler problem number 14:Java: пространство ошибка Heap, проект Эйлера 14
Следующая итерационная последовательность определена для множества натуральных чисел:
- н → п/2 (п даже)
- п → 3n + 1 (п нечетно)
Используя правило выше, и, начиная с 13, мы генерируем следующую последовательность:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
Можно видеть, что эта последовательность (начиная с 13 и заканчивая на 1) содержит 10 терминов. Хотя это еще не доказано (проблема Collatz), считается, что все стартовые номера заканчиваются на 1.
Какой стартовый номер, менее одного миллиона, производит самую длинную цепь?
ПРИМЕЧАНИЕ: После того, как цепь начнет, условия могут превысить один миллион.
Это мой подход:
public class Euler14 {
public static void main(String[] args) {
int temp = 0;
ArrayList<Integer> numbers = new ArrayList<>();
ArrayList<Integer> numberOf = new ArrayList<>();
for(int i = 2; i<1000000; i++) {
numbers.add(i);
temp = i;
while(i!=1) {
if(i%2==0) {
i = i/2;
}
else{
i = (3*i)+1;
}
numbers.add(i);
}
numberOf.add(numbers.size());
Collections.sort(numberOf);
if(numberOf.size()>1) {
numberOf.remove(0);
}
numbers.clear();
i = temp;
System.out.println("Starting number " + i + "\n" +
"Size: " + numberOf + "\n");
}
}
}
Однако при запуске этой программы я получаю эту ошибку при i
= 113282:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Что я мог сделать, чтобы устранить эту ошибку , и как я могу улучшить свой код?
Ваша самая непосредственная проблема заключается в том, что вы снова изменяете переменную 'i' внутри цикла. Таким образом, вы в настоящее время не передаете все значения от 2 до 1000000. Еще один намек: если вы уже знаете, что последовательность коллазиса, начинающаяся с 13, имеет длину 10, вы не могли бы использовать этот факт для вычисления длины для 26? – Sirko
Я получаю вашу мысль. Означает ли это, что нет необходимости проверять цифры меньше 500 000? Так как умножение на 2 приводит к увеличению длины на 1 =>, число чисел меньше 500 000, что приводит к более длинной последовательности collatz, чем более 500 000? – samtob
Нет. Но вы можете использовать поиск, где вы сохраняете результат o ваших вычислений. Поэтому, когда вы вычисляете последовательность, для каждого нового номера, посмотрите на этот поиск, если номер уже присутствует. Если yo, вы можете остановить и использовать этот существующий результат. Также вы можете добавить все числа, с которыми вы столкнулись в этой единственной последовательности, с их соответствующими результатами. – Sirko