トーナメント ブラケット配置アルゴリズム 質問する

トーナメント ブラケット配置アルゴリズム 質問する

対戦相手のシードのリスト (たとえば、シード 1 から 16) が与えられた場合、そのラウンドでトップシードが最下位シードと対戦し、2 番目のシードが 2 番目に低いシードと対戦する、という結果になるアルゴリズムを記述しようとしています。

1 と 16、2 と 15 などを「マッチ」にグループ化するのはかなり簡単ですが、後続のラウンドで上位シードが下位シードと対戦することも確認する必要があります。

正しい配置のブラケットの例:

1対16
            1対8
8対9
                        1対4
4対13
            4対5
5対12
                                    1対2
2対15
            2対7
7対10
                        2対3
3対14
            3対6
6対11

ご覧のとおり、シード 1 と 2 は決勝でのみ対戦します。

ベストアンサー1

このJavaScriptは、各偶数インデックスが次の奇数インデックスを再生する配列を返します。

function seeding(numPlayers){
  var rounds = Math.log(numPlayers)/Math.log(2)-1;
  var pls = [1,2];
  for(var i=0;i<rounds;i++){
    pls = nextLayer(pls);
  }
  return pls;
  function nextLayer(pls){
    var out=[];
    var length = pls.length*2+1;
    pls.forEach(function(d){
      out.push(d);
      out.push(length-d);
    });
    return out;
  }
}

> seeding(2)
[1, 2]
> seeding(4)
[1, 4, 2, 3]
> seeding(8)
[1, 8, 4, 5, 2, 7, 3, 6]
> seeding(16)
[1, 16, 8, 9, 4, 13, 5, 12, 2, 15, 7, 10, 3, 14, 6, 11]

おすすめ記事