Home > しらべる > 順列の列挙

順列の列挙

  • Posted by: memorycraft
  • 2008年4月 1日 16:54
  • しらべる

たとえば、
1,2,4という配列があったとして、これの総当りの順列のリストを出したい。
組み合わせ数が2のときは、[1,2], [1,4], [2,1], [2,4], [4,1], [4,2]
組み合わせ数が3のときは、[1,2,4], [1,4,2], [2,1,4], [2,4,1], [4,1,2], [4,2,1]
という具合。

いくつかの文献を参考にして、こんな風にしたらうまく行ったのでメモ。

/**
 * 順列列挙
 * @param seed 列挙したい配列
 * @param rslt 結果の格納先
 * @param pos 0で呼び出し
 * @param len 組み合わせの数
 */
function permitation(seed:Array, rslt:Object, pos:Number, len:Number) {
    if(pos >= seed.length) {
        rslt[seed.join("").substr(0, len)] = seed.join("").substr(0, len); return;
    }
    permitation(seed, rslt, pos+1, len);
    for(var i = pos+1; i < seed.length; ++i) {
        var tmp = seed[i];
        seed[i] = seed[pos];
        seed[pos] =tmp ;
        permitation(seed, rslt, pos+1, len);
        tmp = seed[i];
        seed[i] = seed[pos];
        seed[pos] =tmp ;
    }
 }

var rslt = {};
permitation([1,2,3,4], rslt, 0, 3);
for(var p in rslt){
    trace(rslt[p]);
}


上記の結果は
412
413
431
432
421
423
342
341
314
312
324
321
241
243
234
231
214
213
142
143
134
132
124
123

permitation([1,2,3,4], rslt, 0, 2);
とした場合は

41
43
42
34
31
32
24
23
21
14
13
12


重複時に上書きして値をセットしている箇所があるので、たぶんこれよりよい方法もあると思うけど、
要素数と組み合わせ数が一桁ならパフォーマンスはそれほど悪くないので、よしとした。

関連記事

Trackbacks:0

TrackBack URL for this entry
http://www.memorycraft.jp/mt-tb.cgi/27
Listed below are links to weblogs that reference
順列の列挙 from メモリークラフト

Comments:0

Comment Form

Home > しらべる > 順列の列挙

ページの先頭へ戻る