2014-11-21 1 views
1

Я пытаюсь представить решение (с помощью онлайн-компилятор, который имеет ограничения по времени компиляции) для сортировки в array- здесь мой код snippet-работает время Flush() для вывода потока

class TSORT { 
    public static void main(String[] args) throws IOException{ 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     PrintWriter bw = new PrintWriter(System.out, false); 
     int t = Integer.parseInt(br.readLine()); 
     int[] list = new int[1000001];  
     for(int i = 0; i < t; i++){ 
      int n = Integer.parseInt(br.readLine()); 
      list[n]++; 
     } 
     int r=0; 
     for(int i = 0; i < 1000001; i++){ 
      if(list[i] > 0){ 

       for(int j = 0; j < list[i]; j++){ 
        bw.println(i);  // if I use bw.flush() here, time limit gets exceeded. 

       } 
      } 
    } 
     bw.flush(); 
    } 
} 

Этот код успешно отправляется, но если я использую flush() как true (автоматический сброс new PrintWriter(System.out, true);), компилятор показывает TIME LIMIT EXCEEDED.

Мой вопрос: как я должен использовать flush(), чтобы получить наилучшее время компиляции?

+1

Возможно, что может произойти время слияния с очисткой «PrintStream»? –

ответ

2

Вы отправляете код, и после этого он выполняется где-то, поэтому у вас есть исключение TIme Limit Exceeded.

Причина, по которой вы не получаете это исключение, если вы отключите автоматическую промывку, просто, как только вы посмотрите на то, что на самом деле означает флеш. flush блокирует ваш код и ждет, пока все, что было написано в потоке, также переместило поток в свою цель (в данном случае System.out).

Если у вас включена автоматическая промывка, она будет смываться после каждой команды println. Поэтому после каждых println вы блокируете приложения и ожидаете, что виртуальная машина Java или система хоста переадресуют вашу строку на System.out.

Если у вас отключена автоматическая промывка, строки в памяти println сохранены в памяти. В зависимости от реализации потока он все равно может попытаться вымыть данные из памяти в фоновом режиме, но это не обязательно. В конце вашего приложения вы сразу же напишете все свои строки (через flush). Это происходит быстрее из-за меньших контекстных переключателей и потому, что оно не блокирует ваше приложение от запуска цикла.

+0

Да! То же самое происходит с Print Stream (System.out.println()). Спасибо! – user3788040