JavaScript を使用して、指定されたプレーヤーのリストからバドミントン ダブルスの試合のすべての組み合わせを計算しています。各プレイヤーは他のプレイヤーとチームを組みます。
例えば。次のプレーヤー a、b、c、d がいるとします。それらの組み合わせは次のとおりです。
a & b V c & d
a & c V b & d
a & d V b & c
私は仕事をするために書いた以下のコードを使用していますが、少し非効率的です。PLAYERS 配列を 4 回ループして、すべての組み合わせ (不可能なものを含む) を見つけます。次に、ゲームをアルファベット順に並べ替え、まだ存在しない場合は GAMES 配列に格納します。次に、GAMES 配列の前半を使用して、すべてのゲームの組み合わせを一覧表示します。
問題は、8 人以上のプレイヤーがいる場合、コンビネーションの成長が指数関数的であるため、実行が非常に遅くなることです。
誰かが私が使用できるより良い方法またはアルゴリズムを知っていますか? 考えれば考えるほど頭が痛くなる!
var PLAYERS = ["a", "b", "c", "d", "e", "f", "g"];
var GAMES = [];
var p1, p2, p3, p4, i1, i2, i3, i4, entry, found, i;
var pos = 0;
var TEAM1 = [];
var TEAM2 = [];
// loop through players 4 times to get all combinations
for (i1 = 0; i1 < PLAYERS.length; i1++)
{
p1 = PLAYERS[i1];
for (i2 = 0; i2 < PLAYERS.length; i2++)
{
p2 = PLAYERS[i2];
for (i3 = 0; i3 < PLAYERS.length; i3++)
{
p3 = PLAYERS[i3];
for (i4 = 0; i4 < PLAYERS.length; i4++)
{
p4 = PLAYERS[i4];
if ((p1 != p2 && p1 != p3 && p1 != p4) &&
(p2 != p1 && p2 != p3 && p2 != p4) &&
(p3 != p1 && p3 != p2 && p3 != p4) &&
(p4 != p1 && p4 != p2 && p4 != p3))
{
// sort teams into alphabetical order (so we can compare them easily later)
TEAM1[0] = p1;
TEAM1[1] = p2;
TEAM2[0] = p3;
TEAM2[1] = p4;
TEAM1.sort();
TEAM2.sort();
// work out the game and search the array to see if it already exists
entry = TEAM1[0] + " & " + TEAM1[1] + " v " + TEAM2[0] + " & " + TEAM2[1];
found = false;
for (i=0; i < GAMES.length; i++)
{
if (entry == GAMES[i]) found = true;
}
// if the game is unique then store it
if (!found)
{
GAMES[pos] = entry;
document.write((pos+1) + ": " + GAMES[pos] + "<br>");
pos++;
}
}
}
}
}
}
前もって感謝します。
ジェイソン。