2016-10-17 1 views
0

J'ai le code suivant pour écrire toutes les permutations et les combinaisons dans un fichier, mais il prend beaucoup de temps pour écrire dans un fichier ... S'il vous plaît suggérer un meilleur code qui ont de bonnes performances. Lorsque je donne l'entrée abcdefghijklmnopqrstuvwxyz et n=5, il faut environ 5 minutes pour l'exécuter.meilleure performance pour écrire toutes les permutations et la combinaison d'une chaîne d'une longueur paticular dans un fichier

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); 

    } 
} 
+0

donnez svp l'entrée comme abcdefghijklmnopqrstuvwxyz et la deuxième entrée comme 5 –

+0

Vous pouvez essayer de déplacer la création du 'FileWriter' et du' BufferedWriter' dans le 'if()'. –

+0

Regardez ici http://stackoverflow.com/questions/5113707/getting-every-possible-permutation-of-a-string-or-combination-including-repeated?rq=1 Cela pourrait aider. – Nurjan

Répondre

3

Si vous voulez accélérer le code, n'ouvrez pas et ne fermez pas le fichier à plusieurs reprises. Ouvrez-le une fois au début de la course et fermez-le une fois à la fin.

L'ouverture d'un fichier implique l'exécution d'au moins syscall, et probablement des milliers d'instructions machine. La création du BufferedWriter est quelques milliers de plus si vous incluez le coût de la «baratte de l'objet» de la création et de l'élimination des tampons. Ces frais généraux ne devraient être encourus qu'une fois ... pas plusieurs fois ... si vous voulez que votre programme fonctionne à un taux raisonnable.

+0

salut, pourriez-vous m'aider avec le code? –

+0

Désolé, mais ce n'est pas un service gratuit de codage. Je devine qu'il s'agit de devoirs ou d'un autre type d'exercice d'apprentissage. C'est vrai, alors le point (tout le point, vraiment) de l'exercice est que vous apprenez en faisant le travail pour vous-même. –