0

パラメータのリストのリストがあり、可能なすべての組み合わせでそれらを結合したいと考えています。リストの数と各リストに指定された値は、実行前にはわかりません。この問題はCartesian_Productで定義され、議論されています。

問題の入力は、値の配列の配列 (またはリストのリスト) に格納できます。例として、2 組のカードが考えられます。2 つのデッキがあり[Red, Blue]、各デッキには 4 つのカードのスーツが[♠, ♥, ♦, ♣]あり、各スーツには 13 枚のカードがあります[Ace, King, Queen, Jack, 10, 9, 8, 7, 6, 5, 4, 3, 2]

これらの配列のデカルト積は、52 枚の可能なトランプの 2 つのデッキで構成される 104 要素のセットを返します。

[[Red, ♠, Ace], [Red, ♠, King], ..., (Red, ♠, 2), (Red, ♥, Ace), ..., (Red, ♣, 2), 
[Blue, ♠, Ace],[Blue, ♠, King], ..., (Blue, ♠, 2), (Blue, ♥, Ace), ..., (Blue, ♣, 2)]

では、値のリストのリストのすべての可能な組み合わせをどのように生成するのでしょうか?

4

1 に答える 1

0

ここでは、Javascript で記述されたソリューションを示します。

問題の考えられる入力:

var parameterList = [ [ 'Red', 'Blue' ],
                [ '\u2660', '\u2665', '\u2666', '\u2663' ],
                [ 'Ace', 'King', 'Queen', 'Jack', 10, 9, 8, 7, 6, 5, 4, 3, 2 ] ];

組み合わせ数を計算する

var num_comb = 1;
for ( var i = 0; i < parameterList.length; i++)
    num_comb *= parameterList[i].length;

すべての可能な組み合わせの生成:

// index used to store the positions of the combination just generated
var index = new Array(parameterList.length);
for ( var i = 0; i < parameterList.length; i++)
  index[i] = 0;

//array of arrays that will store the final result (i.e., all possible combinations)
var combinationsList = [];

do {
  var temp = [];
  for ( var i = 0; i < index.length; i++)
    temp[i] = parameterList[i][index[i]];
  combinationsList.push(temp);
} while (nextIndex());


function nextIndex() {
  var carryover = true;
  for ( var i = parameterList.length - 1; i >= 0 && carryover; i--) {
    index[i] = (index[i] + 1) % parameterList[i].length;
    if (index[i] != 0)
      carryover = false;
  }
//if 'carryover' is true and 'i' is equal to zero means that all possible combinations 
//have been generated. In this case 'nextIndex' is equal to the first combination.
  return !carryover;
}

var allCombString = printCombinationsList();

すべての組み合わせを印刷するには:

function printCombinationsList() {
  var ret = "";
  for ( var i = 0; i < combinationsList.length; i++) {
    for ( var j = 0; j < combinationsList[i].length; j++)
      ret += ((j == 0) ? "[" : "") + combinationsList[i][j] + ((j == combinationsList[i].length - 1) ? "]": ", ");
    ret += "<br/>";
  }
return ret;
}
于 2013-04-03T08:36:14.230 に答える