2016-09-24 6 views
0

私は123456789のすべての順列を取得しようとしています。私はJTreeを使用しています。私はコンピュータを地面に燃やさなければこれを回避することはできません。ここで私が持っているものです。9過去の番号を返すことなくネストされたFors

//create the root node 
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
//create the child nodes 
for (int x=1; x<10; x++){ 
    DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(x); 
    root.add(leaf); 
    for (int x1=1; x1<9;x1++){ 
     DefaultMutableTreeNode leaf1 = new DefaultMutableTreeNode(x1);   
     leaf.add(leaf1); 
     for (int x2=1; x2<8;x2++){ 
      DefaultMutableTreeNode leaf2 = new DefaultMutableTreeNode(x2); 
      leaf1.add(leaf2); 
      for (int x3=1; x3<7;x3++){ 
       DefaultMutableTreeNode leaf3 = new DefaultMutableTreeNode(x3); 
       leaf2.add(leaf3); 
       for (int x4=1; x4<6;x4++){ 
        DefaultMutableTreeNode leaf4 = new DefaultMutableTreeNode(x4); 
        leaf3.add(leaf4); 
        for (int x5=1; x5<5;x5++){ 
         DefaultMutableTreeNode leaf5 = new DefaultMutableTreeNode(x5); 
         leaf4.add(leaf5); 
         for (int x6=1; x6<4;x6++){ 
          DefaultMutableTreeNode leaf6 = new DefaultMutableTreeNode(x6); 
          leaf5.add(leaf6); 
          for (int x7=1; x7<3;x7++){ 
           DefaultMutableTreeNode leaf7 = new DefaultMutableTreeNode(x7); 
           leaf6.add(leaf7); 
           for (int x8=1; x8<2;x8++){ 
            DefaultMutableTreeNode leaf8 = new DefaultMutableTreeNode(x8); 
            leaf7.add(leaf8); 
            for (int x9=1; x9<1;x9++){ 
             DefaultMutableTreeNode leaf9 = new DefaultMutableTreeNode(x9); 
             leaf8.add(leaf9); 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

(X1 = X!)場合、私が試したが、私はそうでX1 < 10にステートメントを変更する必要があるとします。これを行う効率的な方法はありますか?

+1

あり、それにはおそらくきれいに見えるのアプローチがありますが、私はあなたが行っていることを疑いますO(n!)よりもランタイムの効率を上げるためには、その "文字列"の各順列を取っているからです。 – Makoto

+0

それはすべての可能な文字順列をあらかじめ計算しておき、文字列の各文字ですべての文字順列をループしてツリーを作成することです。 –

+1

「効率的」とは、「より速く走る」(ビッグ・オー、壁時計の時間が短いほど良い)、「メモリがより少なくなる」、「コードの数が少ない」などです。 –

答えて

0

再帰を使用できます。このアルゴリズムの説明はhereです。

public class Permutations { 
    private boolean[] used; 
    private StringBuilder out = new StringBuilder(); 
    private final String in; 

    public Permutations(final String str) { 
     in = str; 
     used = new boolean[in.length()]; 
    } 

    public void permute() { 
     if (out.length() == in.length()) { 
      System.out.println(out); 
      return; 
     } 
     for (int i = 0; i < in.length(); ++i) { 
      if (used[i]) 
       continue; 
      out.append(in.charAt(i)); 
      used[i] = true; 
      permute(); 
      used[i] = false; 
      out.setLength(out.length() - 1); 
     } 
    } 
} 

これは、順列クラスの使用例である:

public class Main { 

    public static void main(String[] args) { 
     Permutations permutation = new Permutations("123"); 
     permutation.permute(); 
    } 

} 

コンソール出力:

123 
132 
213 
231 
312 
321 
関連する問題