轮空 %4 的双淘汰赛算法

Posted

技术标签:

【中文标题】轮空 %4 的双淘汰赛算法【英文标题】:Double Elimination Tournament Algorithm for byes %4 【发布时间】:2012-05-14 10:35:16 【问题描述】:

我正在尝试编写一个双淘汰锦标赛,其中括号基于 mod 4。第一轮应该处理所有轮空,以便在第 2 轮之后不再有轮空。我很难弄清楚确定我需要的轮空数量背后的实际数学。如果有人可以帮助我解决这背后的数学问题,将不胜感激。

对于任何 mod 4 (0,1,2,3) 我需要处理 1,2,3 的再见,有 4 个可能的答案。

我的意思的一个例子是 13 名球员(13%4=1) 所以第一轮括号应该看起来像 1对2 2vs3 3vs4 4对5 5对6

第二轮是 7对胜者 8对胜者 9对胜者 赢家对赢家,然后你有输家的括号

基本上,如果您熟悉网站 Challenge,我想生成与它们相似的括号,但我无法弄清楚它们确定轮空背后的数学原理。

如果有人做过类似的事情,我将非常感谢他的帮助。

【问题讨论】:

我认为你走错了路,因为参加锦标赛的人数是 2 的幂,而不是 4 的倍数。 你说得对,我的组长就是那个说mod 4的人......我不知道我为什么听他的。 after round 2 there will be no more byes 无法保证!如果您在锦标赛中的任何时候都有奇数玩家,则需要轮空。 【参考方案1】:

其中N是参赛者的数量,轮数将是:

nRounds = Math.Ceiling( Math.Log( N, 2 ) );

第一轮的名额为:

firstRoundSlots = Math.Pow( 2, nRounds );

排名靠前的竞争对手轮空,因此在您的示例中,16 轮比赛中有 13 名竞争对手,因此前 3 名竞争对手轮空。也就是说,byes的数量是firstRoundSlots - N

比赛的顺序有点复杂。基本上,这个想法是总决赛是最好的竞争对手与第二好的竞争对手。在半决赛中,最好的选手对战第三名的选手,第二名的选手对战第四名的选手。等等等等。所以最容易从决赛倒推生成顺序。

但是,如果您想知道一种用于反向生成回合顺序的算法(即,从第 1 轮开始并朝着决赛的方向努力),我在这里写了一篇关于此的博客文章:

http://blogs.popart.com/2012/02/things-only-mathematicians-can-get-excited-about/

【讨论】:

【参考方案2】:

我会告诉你我是如何解决这个问题的。 您希望在第 2 轮中有许多玩家,这是 2 的幂。

第2轮的玩家人数为:(matches in round 1)/2 + byes) 设 P 为玩家人数。

2^n = (P-byes)/2 + byes
2^(n+1) = P-byes + 2*byes
2^(u) = P + byes

所以找到最小的u s.t. 2^u >= P,然后是2^u-P,再见。

示例案例: 7 -> 2^u=8 -> (8-7) -> 1 再见 1 轮空,3 场比赛 -> 第 2 轮有 4 名玩家

这不是 mod 4,将 9 名玩家与 13 名玩家进行比较: 9 -> 2^u=16 -> (16-9) -> 7 个字节 13 -> 2^u=16 -> (16-13) -> 3 个字节

一个更有趣的问题是如何安排最少轮空次数,允许在第一轮以外的其他轮次中进行轮空。

【讨论】:

【参考方案3】:

我能想到的最简单的算法:

    播种玩家(使用实际信息或一些随机的东西) 玩家的排名取决于当前积分,如果是平局,则取决于种子 在比赛的每个阶段,从排名最高的玩家到排名最低的玩家,将每个玩家与他们没有玩过的排名第二的玩家配对 排名最低的玩家通常会得到再见 如果一个人总共输掉两场比赛(或在平局盛行的情况下输掉两场比赛),那么这个人就退出了比赛 重复此操作,直到锦标赛中只剩下一个玩家

【讨论】:

以上是关于轮空 %4 的双淘汰赛算法的主要内容,如果未能解决你的问题,请参考以下文章

redis key的删除淘汰策略

吃透Redis:缓存淘汰篇-LFU算法

吃透Redis:缓存淘汰篇-LFU算法

吃透Redis:缓存淘汰篇-LFU算法

操作系统知识

基础篇4 # 链表(上):如何实现LRU缓存淘汰算法?