Я решаю проблему на spoj
, и система показывает, что моя программа взяла 1341M
памяти. Когда я смотрю материалы на других языках, они требуют ~3M
, что примерно в 400 раз меньше!Большая занимаемая память на простом Java-коде
Мой код ниже:
class Main {
static List<BigInteger> numbers = new ArrayList<>();
static {
BigInteger max = BigInteger.TEN.pow(100);
numbers.add(BigInteger.ONE);
numbers.add(BigInteger.valueOf(2l));
BigInteger last = numbers.get(1);
while (last.compareTo(max) <= 0) {
numbers.add(numbers.get(numbers.size() - 1).add(numbers.get(numbers.size() - 2)));
last = numbers.get(numbers.size() - 1);
}
}
public static void main(String[] args) throws java.lang.Exception {
BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));
String line;
String delims = " ";
while ((line = bi.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(line, delims);
BigInteger from = new BigInteger(tokenizer.nextToken());
BigInteger to = new BigInteger(tokenizer.nextToken());
if (from.equals(BigInteger.ZERO) && to.equals(BigInteger.ZERO)) {
return;
} else {
System.out.println(countInRange(from, to));
}
}
}
public static int countInRange(BigInteger from, BigInteger to) {
int fromIndex = Collections.binarySearch(numbers, from);
fromIndex = fromIndex < 0 ? Math.abs(fromIndex) - 1 : fromIndex;
int toIndex = Collections.binarySearch(numbers, to);
toIndex = toIndex < 0 ? Math.abs(toIndex) - 1 : toIndex + 1;
return toIndex - fromIndex;
}
}
Я полагаю, что BufferedReader
является причиной высокого потребления памяти. Возможно ли в этом случае значительно улучшить память? Я не говорю о достижении 3M
, но, по крайней мере, находясь под 100M
или около того.
Чтобы воспроизвести проблему, вам необходимо знать входные данные программы. – Armali