2011-07-26 2 views
0

Я работаю над проблемой проектора, и я столкнулся с OutOfMemoryError.
И я не понимаю, почему, потому что мой код работал красиво (по крайней мере, моим новичкам: P).
Все работает отлично, пока петля не достигнет 113383.
Если кто-то может помочь мне отладить это, мы будем очень благодарны, потому что я совсем не понимаю, почему он терпит неудачу.Почему я получаю OutOfMemoryError в java?

Мой код

import java.util.Map; 
import java.util.HashMap; 
import java.util.Stack; 

/* 
* The following iterative sequence is defined for the set of positive integers: 
n = n/2 (n is even) 
n = 3n + 1 (n is odd) 
Using the rule above and starting with 13, we generate the following sequence: 
13 40 20 10 5 16 8 4 2 1 
It can be seen that this sequence (starting at 13 and finishing at 1) contains 
10 terms. Although it has not been proved yet (Collatz Problem), it is thought 
that all starting numbers finish at 1. Which starting number, under one million, 
produces the longest chain? 
NOTE: Once the chain starts the terms are allowed to go above one million. 
*/ 
public class Problem14 { 

    static Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
    final static int NUMBER = 1000000; 

    public static void main(String[] args) { 

     long start = System.currentTimeMillis(); 
     map.put(1, 1);  
     for (int loop = 2; loop < NUMBER; loop++) { 
      compute(loop); 
      //System.out.println(map); 
      System.out.println(loop); 
     }  
     long end = System.currentTimeMillis(); 
     System.out.println("Time: " + ((end - start)/1000.) + " seconds"); 
    } 

    private static void compute(int currentNumber) { 
     Stack<Integer> temp = new Stack<Integer>(); 
     /** 
     * checks to see if current value is already 
     * part of the map. if it isn't, add to temporary 
     * stack. also if current value exceeds 1 million, 
     * don't check map or add to stack. 
     */ 
     while (!map.containsKey(currentNumber)){ 
      temp.add(currentNumber); 
      currentNumber = realCompute(currentNumber); 
      while (currentNumber > NUMBER){ 
       currentNumber = realCompute(currentNumber); 
      } 
     } 
     System.out.println(temp); 
     /** 
     * adds members of the temporary stack to the map 
     * based on when they were placed in the stack 
     */ 
     int initial = map.get(currentNumber) + 1; 
     int size = temp.size(); 

     for (int loop = 1; loop <= size; loop++){ 
      map.put(temp.pop(), initial); 
      initial++; 
      //key is the top of stack 
      //value is initially 1 greater than the current number that was 
      //found at the map, then incremented by 1 afterwards; 
     } 
    } 

    private static int realCompute(int currentNumber) { 

     if (currentNumber % 2 == 0) { 
      currentNumber /= 2; 
     } else { 
      currentNumber = (currentNumber * 3) + 1; 
     } 
     return currentNumber; 
    } 
} 
+4

Возможно, это потому, что у вас просто не хватает памяти? Поскольку это проблема Project Euler, попробовали ли вы увеличить размер кучи? –

ответ

2

Кажется мне, это только то, что ошибка говорит: вы бежите из памяти. Увеличьте размер кучи с помощью -Xmx (например, java -Xmx512m).

Если вы хотите уменьшить площадь памяти, посмотрите на GNU Trove для более компактной (и более быстрой) реализации примитивных карт (вместо использования HashMap<Integer,Integer>).

+0

Хммм, что имеет смысл, за исключением одной проблемы ... где я могу поместить этот код? Я попробовал посмотреть в Интернете, и что-то о командной строке было упомянуто, но я боюсь, что не понимаю, что делать ... –

+0

Это зависит от того, как вы запускаете свое приложение. Если вы работаете с Eclipse, он находится в «Run -> Run Configurations ... -> Arguments (tab) -> VM Arguments (box)». Я не знаком с проектировщиком, есть ли у него собственный пусковой механизм? – Dmitri

+0

О, ладно, вот как это делается. Я использую Eclipse. projecteuler - это веб-сайт, который предоставляет проблемы программирования, которые имеют дело с большим количеством вычислений. (Www.projecteuler.net). Теперь, когда я нахожусь в роли, я смущен тем, что именно ввести. Я поставил «java -Xmx512m» и «-Xmx512m» там, и ни один из них не работал. –

0

Какая ошибка OutOfMemory? Куча, Пермген ...? Вероятно, необходимо увеличить размер кучи или размер перггена.

0

вы должны определить HashMap как: map = new HashMap (NUMBER).

знаете, «Entry [] table» - это структура данных карты, автоматическая емкость.

причина для основной мощности: 1, не массив копия. 2, работайте быстрее.

1

У меня точно такая же проблема, как у вас ... Проблема на самом деле заключается в «Stack temp», и изменить ее на Long будет хорошо. Это простое переполнение.

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