我正在制作一个
HTML / JS驱动的单/双消除支架Web应用程序.我正在努力弄清楚如何从种子队/球员名单中分配第一轮比赛.例如,在8名球员的支架中,第一轮比赛是:
1V8
4V5
2V7
3V6
在更通用的术语中,种子可以被认为是一个数组(因为我通过弹出一个数组来指定团队匹配):
1,2,3,4,5,6,7,8
需要分类到:
1,8,6
为了澄清,较高的种子需要在排序的阵列中具有它们之间的最大距离,这使得在没有扰乱的括号中,较低的种子首先被淘汰并且与高种子的匹配尽可能晚地发生.实际上,想想一个网球锦标赛,你想要阻止16或32等支架的前4名球员互相比赛直到半决赛.因此,16种子支架的正确数组输出是:
1,16,9,13,12,15,10,14,11
转换为以下第一轮比赛:
1v16 8v9 4v13 5v12 2v15 7v10 3v14 6v11
感谢Matt Ball提供8种子支架的正确算法
解决方法
从顶部和底部匹配玩家的想法是正确的但不完全.这样做对于第一轮来说非常有用:
while (seeds.length) { firstRound.push(seeds.shift()); firstRound.push(seeds.pop()); } 1,8 => 1,5
……但是在第二轮中,种子1遇到种子2和3遇到4.我们需要为每一轮做第一次/最后一次洗牌.第一次,我们单独移动每个元素.第二次,我们移动每个元素的PAIR.第三次通过我们移动四个等组,直到我们的组大小为seeds.length / 2.像这样:
// this is ruby,aka javascript psuedo-code :) bracket_list = seeds.clone slice = 1 while slice < bracket_list.length/2 temp = bracket_list bracket_list = [] while temp.length > 0 bracket_list.concat temp.slice!(0,slice) # n from the beginning bracket_list.concat temp.slice!(-slice,slice) # n from the end end slice *= 2 end return bracket_list
这是在进行迭代时数组的样子(括号表示增加的组大小):
1,11,16 (1,16),(2,15),(3,14),(4,13),(5,12),(6,11),(7,10),(8,9) (1,9),12) (1,11)
所以现在,在排名最后的8名球员被淘汰之后,我们留下了1,6.在底部4被淘汰后,我们有1,而在最后一轮只有1,2.
如果不能画出一个括号,很难解释这一点……如果我能为你澄清一些内容,请告诉我.