斐波纳契运动中的堆错误

时间:2018-03-30 12:34:08

标签: java

我被赋予了一个编写程序的简单任务,该程序将从给定文件中找到所有斐波那契数字,而不是返回最大和最小的数字。 不幸的是,在尝试执行Java堆空间错误时。 我真的不知道哪里出错了,你能帮我一点吗? 以及如何避免将来再犯同样的错误。

    package maturaWielkanoc;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public class Zad4 {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(0);
        list.add(1);
        int counter = 1;
        while (list.get(list.size() - 1) < 908589244) {
            //908589244 is one bigger than the biggest number in dane.txt
            list.add(list.get(counter) + list.get(counter));
        }
        try (BufferedReader br = new BufferedReader(new FileReader("dane.txt"))) {
            String line;
            List<Integer> answer = new ArrayList<>();
            while ((line = br.readLine()) != null) {
                int value = Integer.parseInt(line);

                if (list.contains(value)) {
                    answer.add(value);
                }
            }
            answer.sort(null);
            System.out.println("Min = " + answer.get(0));
            System.out.println("Max = " + answer.get(answer.size() - 1));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

2 个答案:

答案 0 :(得分:2)

您的应用程序将使用固定数量的内存运行,而List将在内存中存储和保存数据,并不断填充它。您将继续将整数添加到列表中,并且看不到尽头。

快速谷歌显示一个盒装整数是8个字节,你的上限是908589244个整数。相反,让我们想象你试图存储10亿个整数,即8个演出,这将很快填满你的堆。

这项任务显然是关于内存管理的一课。您将希望找到一种更好的方法来保存数据并维护最大和最小的斐波那契数字而不将它们全部存储在内存中(考虑在从文件中读取每个值而不是添加到列表时对每个值进行评估)。

答案 1 :(得分:1)

而不是列表中的每个数字(您可能内存不足)存储了您看到的最大数字和您看到的最小数字,以及从文件读取的数字是否大于最大数量它,小于最小:

int largest = Integer.MIN_VALUE;
int smallest = Integer.MAX_VALUE;

while(read integers from file){
  int numberFromFile = Integer.parseInt(fromFile);
  if(numberFromFile > largest){
    largest = numberFromFile;
  }
  if(numberFromFile < smallest){
    smallest = numberFromFile;
  }
}

// Now you have largest and smallest without a huge list.