だけの数学
すべてのラウンドは、チームのpow(2, Rounds - Round + 1)
と試合のpow(2, Rounds - Round)
が含まれていることを、覚えておいてください。幾何学的な進歩としてまとめてください。ラウンド$round
前に撮影した試合の
数a=2^(rounds-1)
、r=1/2
、n=round-1
とgeometric progression2^(rounds-1) + 2^(rounds-2) + ... 2^(rounds - round + 1)
です。その合計は2^(rounds) - 2^(rounds+1-round)
です。
したがって、一致するIDと次の一致IDは、単に,round
、rounds
の3つの引数の関数に過ぎません。私はその計算を関数getMatchId
とgetNextId
に移しました。
例
<?php
// just matchesInPreviousRounds + parnum
function getMatchId($pairnum, $round, $rounds) {
// matchesInPreviousRounds - is a sum of a geometric progression
// 2^(rounds-1) + 2^(rounds-2) + ... 2^(rounds - round + 1)
// with a=2^(rounds-1), r=1/2, n = round-1
// its sum is 2^(rounds) - 2^(rounds+1-round)
$inPreviousRounds = $round > 1 ? (pow(2, $rounds) - pow(2, $rounds + 1 - $round)) : 0;
$id = $inPreviousRounds + $pairnum;
return (int)$id;
}
// next id is last id of a round + half a pairnum.
function getNextId($pairnum, $round, $rounds) {
if($round === $rounds) {
return false;
}
$matchesInThisAndPreviousRounds = pow(2, $rounds) - pow(2, $rounds - $round);
$nextid = $matchesInThisAndPreviousRounds + ceil($pairnum/2);
return (int)$nextid;
}
$divide = 64; // for 1/64 at the start
$power = round(log($divide)/log(2)); // get 6 for 64
$rounds = (int) $power + 1;
for($round = 1; $round <= $rounds; $round++) {
// every round contains 2^($rounds - $round + 1) of teams
// and has 2^($rounds - $round) of matches
$teamsLeft = pow(2, $rounds - $round + 1);
$pairsLeft = pow(2, $rounds - $round);
for($pairnum = 1; $pairnum <= $pairsLeft; $pairnum++) {
$id = getMatchId($pairnum, $round, $rounds);
$nextid = getNextId($pairnum, $round, $rounds);
echo "Round $round, pair $pairnum, id $id ";
echo "winner goes to " . $nextid ? $nextid : "A BAR" . "\n";
}
}
その結果
Round 1, pair 1, id 1, winner goes to 65
Round 1, pair 2, id 2, winner goes to 65
...
Round 1, pair 62, id 62, winner goes to 95
Round 1, pair 63, id 63, winner goes to 96
Round 1, pair 64, id 64, winner goes to 96
Round 2, pair 1, id 65, winner goes to 97
Round 2, pair 2, id 66, winner goes to 97
...
Round 2, pair 29, id 93, winner goes to 111
Round 2, pair 30, id 94, winner goes to 111
Round 2, pair 31, id 95, winner goes to 112
Round 2, pair 32, id 96, winner goes to 112
Round 3, pair 1, id 97, winner goes to 113
Round 3, pair 2, id 98, winner goes to 113
...
Round 3, pair 13, id 109, winner goes to 119
Round 3, pair 14, id 110, winner goes to 119
Round 3, pair 15, id 111, winner goes to 120
Round 3, pair 16, id 112, winner goes to 120
Round 4, pair 1, id 113, winner goes to 121
Round 4, pair 2, id 114, winner goes to 121
...
Round 4, pair 7, id 119, winner goes to 124
Round 4, pair 8, id 120, winner goes to 124
Round 5, pair 1, id 121, winner goes to 125
Round 5, pair 2, id 122, winner goes to 125
Round 5, pair 3, id 123, winner goes to 126
Round 5, pair 4, id 124, winner goes to 126
Round 6, pair 1, id 125, winner goes to 127
Round 6, pair 2, id 126, winner goes to 127
Round 7, pair 1, id 127, winner goes to A BAR
次にマッチIDがラウンドの最後のIDと現在のペアインデックスから計算することができる : '$ NEXTID = $ roundLastId + 1 +(INT )floor($ pairIndex/2); '。 Btw。ペアの数は2のべき乗(2,4,8,16 ...)にする必要があります。 – shudder
@shudderそれはほぼ正しいだろう!しかし、次回のIDとは異なるIDで複数のマッチが実行される可能性がありますので、POCを通過しました:P – Darren
この場合、確定的ではないため、次の一致IDをアルゴリズムで把握することはできません。まずデータレベルで解決する必要があります。共通のラダー/ラウンドID(同じラダー/ラウンド内で一致IDを計算できるように)を使用して、またはリレーショナルデータベースを扱っていない場合は、ツリー構造に直接進むことで、next_matchフィールドをペアにすることもできます。 – shudder