同じものを含む組合せの質問をJavaでプログラムを作って解いてみました。(^_^;
組み合わせの生成では、順列を生成して、昇順になっていないものをスキップしているだけですが、前回のと違って、同じものを含んでいても大丈夫です。
後半無駄にスキップしているはずなので、もうちょっと工夫すれば、もう少し速くなると思います。(^_^;
●GenComb.java
/* * GenComb.java * */ import java.util.Arrays; class GenComb { static boolean isAscending(char[] p,int m) { for(int i=0; i< m-1; i++) if(p[i]> p[i+1]) return(false); return(true); } static void swap(char[] s, int i, int j) { char t = s[i]; s[i] = s[j]; s[j] = t; } static boolean next_comb(char[] p, int n, int r) { int i, j, k; if(r <= 0 || n < r) return(false); do{ for(i = r + 1; i <= n-1; i++) for(j = i; j >= r + 1 && p[j-1] < p[j]; j--) swap(p,j,j-1); for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--); if(i==0) return(false); for(j = n - 1; j > i && p[i-1] >= p[j]; j--); swap(p,j,i-1); for(j = n - 1; i < j; i++, j--) swap(p,i,j); } while(!isAscending(p,r)); return(true); } static String sSort(String s) { char[] c=s.toCharArray(); Arrays.sort(c); return(new String(c)); } public static void main(String[] args) { final String BALL=sSort("白白赤赤赤青青青青"); // 念のためのソート final int N=BALL.length(); final int R= 5; char[] ball=BALL.toCharArray(); long tm=System.nanoTime(); // Timer Start int count=0; do{ count++; System.out.println(new String(ball).substring(0,R)); }while(next_comb(ball,N,R)); System.out.println("計: "+count); tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
白白赤赤赤 白白赤赤青 白白赤青青 白白青青青 白赤赤赤青 白赤赤青青 白赤青青青 白青青青青 赤赤赤青青 赤赤青青青 赤青青青青 計: 11 Runtime : 0.003 [sec]
P.S.
ちなみに、isAscendingとswapとnext_combメソッドを1つにまとめると、次のようになります。(^_^;
// 組合せ生成 static boolean next_comb(char[] p, int n, int r) { int i, j; char t; if(r <= 0 || n < r) return(false); do{ for(i = r + 1; i <= n-1; i++) for(j = i; j >= r + 1 && p[j-1] < p[j]; j--){ t = p[j]; p[j] = p[j-1]; p[j-1] = t; // swap(p,j,j-1); } for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--); if(i==0) return(false); for(j = n - 1; j > i && p[i-1] >= p[j]; j--); t = p[j]; p[j] = p[i-1]; p[i-1] = t; // swap(p,j,i-1); for(j = n - 1; i < j; i++, j--){ t = p[i]; p[i] = p[j]; p[j] = t; // swap(p,i,j); } for(i = 0; i< r-1; i++) if(p[i]> p[i+1]) break; } while (i< r-1); return(true); }
- 作者: 柴田望洋
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2007/11/07
- メディア: 単行本
- 購入: 5人 クリック: 42回
- この商品を含むブログ (20件) を見る
- 作者: 紀平拓男,春日伸弥
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2011/03/26
- メディア: 単行本
- 購入: 15人 クリック: 255回
- この商品を含むブログ (31件) を見る
- 作者: 近藤嘉雪
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2011/01/26
- メディア: 単行本
- 購入: 1人 クリック: 15回
- この商品を含むブログ (5件) を見る