лучшая производительность для записи всех перестановок и комбинаций строки определенной длины в файле

У меня есть следующий код для записи всех перестановок и комбинаций в файл, но запись в файл занимает много времени... Пожалуйста, предложите лучший код, который имеет хорошую производительность. Когда я ввожу ввод abcdefghijklmnopqrstuvwxyz и n=5, выполнение занимает около 5 минут.

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.text.Collator;
import java.util.Arrays;

import java.util.Locale;
import java.util.Scanner;

public class permutation {

    static int c;
    static  Scanner s=new Scanner(System.in);
    static String input =s.nextLine();

    int size = s.nextInt();
    boolean[] num = new boolean[input.length()];

    public void generate(String data) throws Exception {
         FileWriter fstream = new FileWriter("D:\\out.txt",true);
         BufferedWriter out = new BufferedWriter(fstream);
         if (data.length() == size) {
              out.newLine();
              out.write(data);
              System.out.println(data);
              c++;
              out.close();
              return;
         } 
         for (int i = 0; i < input.length(); ++i) {
            if (!num[i]) {
                num[i] = true;
                generate(data + input.charAt(i));                   
                num[i] = false;      
            }

         }
    }


    public static void main(String[] args) throws Exception {
        long startTime = System.currentTimeMillis();
        permutation obj = new permutation();
        Collator col = Collator.getInstance(new Locale("en", "EN"));
        String s = input;
        String[] s1= s.split("");
        Arrays.sort(s1, col);
        String sorted = "";
        for (int i = 0; i < s1.length; i++) {
            sorted += s1[i];
        }
        input=sorted;
        System.out.println(input);
        obj.generate("");
        System.out.println();


        long endTime   = System.currentTimeMillis();
        long totalTime = endTime - startTime;
        System.out.println(totalTime);

    }
}

person manoj varma    schedule 17.10.2016    source источник
comment
введите ввод как abcdefghijklmnopqrstuvwxyz и второй ввод как 5   -  person manoj varma    schedule 17.10.2016
comment
Вы можете попробовать перенести создание FileWriter и BufferedWriter в файл if().   -  person Florent Bayle    schedule 17.10.2016
comment
Посмотрите здесь stackoverflow.com/questions/5113707/ Это может помочь.   -  person Nurjan    schedule 17.10.2016


Ответы (1)


Если вы хотите ускорить код, не открывайте и не закрывайте файл повторно. Откройте его один раз в начале цикла и закройте один раз в конце.

Открытие файла требует выполнения как минимум системного вызова и, вероятно, тысяч машинных инструкций. Создание BufferedWriter стоит на несколько тысяч больше, если включить стоимость «изменения объектов» при создании и удалении буферов. Эти накладные расходы должны возникать только один раз... не несколько раз... если вы хотите, чтобы ваша программа работала с разумной скоростью.

person Stephen C    schedule 17.10.2016
comment
Извините, но это не бесплатная служба кодирования. Я предполагаю, что это домашнее задание или какое-то другое учебное упражнение. Если это правда, то смысл (на самом деле ВЕСЬ смысл) упражнения в том, что вы учитесь, выполняя работу для себя. - person Stephen C; 17.10.2016