Я использую онлайн-платформу для автоматической оценки программ, и для одного из упражнений «сканер» Java использует слишком много памяти (мы только начинаем поддерживать Java, поэтому проблема не возникала раньше).Поскольку мы преподаем алгоритмику начинающим, мы не можем просто попросить их перекодировать их самостоятельно, читая один байт за другим.
Согласно нашим тестам, сканер использует до 200 байт для чтения ОДНОГОцелое число ...
Упражнение: 10 000 целых чисел, какое окно из 100 последовательных целых чисел имеет максимальную сумму?
Использование памяти мало (вам нужно запомнить только последние 100 целых чисел)но между классической версией с «Scanner / nextInt ()» и ручной версией (см. ниже) мы можем видеть разницу в 2,5 МБ в памяти.
2,5 МБ для чтения 10 000 целых чисел ==> 200 байтчитать одно целое число ??
Есть ли какое-нибудь простое решение, которое можно объяснить новичку, или следующая функция (или похожая) - путь?
Наш тест-Функция для чтения целых чисел намного быстрее при использовании гораздо меньшего количества памяти:
public static int read_int() throws IOException
{
int number = 0;
int signe = 1;
int byteRead = System.in.read();
while (byteRead != '-' && ((byteRead < '0') || ('9' < byteRead)))
byteRead = System.in.read();
if (byteRead == '-'){
signe = -1;
byteRead = System.in.read();
}
while (('0' <= byteRead) && (byteRead <= '9')){
number *= 10;
number += byteRead - '0';
byteRead = System.in.read();
}
return signe*number;
}
Код с использованием сканера, согласно запросу:
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nbValues = sc.nextInt();
int widthWindow = sc.nextInt();
int values[] = new int[widthWindow];
int sumValues = 0;
for (int idValue = 0; idValue < widthWindow; idValue++){
values[idValue] = sc.nextInt();
sumValues += values[idValue];
}
int maximum = sumValues;
for (int idValue = widthWindow; idValue < nbValues; idValue++)
{
sumValues -= values[ idValue % widthWindow ];
values[ idValue % widthWindow ] = sc.nextInt();
sumValues += values[ idValue % widthWindow ];
if (maximum < sumValues)
maximum = sumValues;
}
System.out.println(maximum);
}
}
По запросу, память используется как функциянючисло целых чисел:
- 10 000: 2,5 МБ
- 20 000: 5 МБ
- 50 000: 15 МБ
- 100 000: 30 МБ
- 200 000: 50 МБ
- 300 000: 75 МБ