javascript – 排序锦标赛种子

前端之家收集整理的这篇文章主要介绍了javascript – 排序锦标赛种子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一个 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.

如果不能画出一个括号,很难解释这一点……如果我能为你澄清一些内容,请告诉我.

猜你在找的JavaScript相关文章