在文件中编写所有排列和特定长度字符串组合的最佳性能

时间:2016-10-17 07:17:58

标签: java permutation bufferedwriter

我有以下代码来编写文件中的所有排列和组合,但是写入文件需要花费大量时间...请建议性能更好的更好的代码。 当我提供输入abcdefghijklmnopqrstuvwxyzn=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);

    }
}

1 个答案:

答案 0 :(得分:3)

如果您想让代码更快,请不要重复打开和关闭文件。在运行开始时打开一次,最后关闭一次。

打开文件涉及至少执行系统调用,可能还有数千条机器指令。如果包含创建和处理缓冲区的“对象流失”的成本,则BufferedWriter的创建会增加几千个。这些管理费用应该只发生一次...不是多次......如果你希望你的程序以合理的速度运行。