我正在转换我的Tournament Organizer软件,允许创建和操作Double Elimination Tournaments,使用MVVM设计模式,以便更容易测试。在这样做的时候,我将'模型'与UI中直接操作括号结构的一些代码分开。
这将是我为处理锦标赛而编写的软件的第三次迭代。第一个是用PHP编写的,并将数据存储在数据库中。第二个版本是我制作的WPF版本,它将数据存储在内存中,然后将其序列化为XML文件。但是,在这两个版本中,我认为实施的各个方面都不干净,而且看起来它们违反了DRY法则。
如果您是从头开始创建数据结构来处理双重删除括号,那么您将如何做?
请注意,它不需要能够在算法上自动生成括号(从4/8/16/32人预先制作的双重消除加载是我现在正在做的方式),只是设置比赛获胜者并通过括号“推进”它们的主要用例。
编辑:为了说清楚,数据结构需要处理双重淘汰锦标赛,因此,一场比赛的胜利者最终可能会与另一场比赛的输家竞争。
答案 0 :(得分:2)
所以,在终点,你有64支球队。所以有一个64个团队的集合。
但他们已经配对了,对于每一对,都有一个胜利者。在中间括号中,胜利者实际上是从括号中出现的,所以我认为你的括号对象实际上看起来像:
public class Bracket
{
Team winner; //if this is null or whatever, then we don't have a winner yet
Bracket topBracket;
Bracket bottomBracket;
}
...当你实例化你的目标时,你只需将两个子括号留空,只有一个胜利者。
要处理双重消除,有第二个括号,这是一个输家支架。如果你可以自动将失败者添加到这个支架中(设计一个以32开头的支架,从第二轮赢得16个输家,等等),这将是很好的,但这都是实施。数据结构不需要改变以适应它,你只需要更多它们。
答案 1 :(得分:1)
我的解决方案是拥有两组数据结构。一个用于支架部分,一个用于座椅。
class Match
{
string Id;
MatchSeat red;
MatchSeat blue;
MatchSeat winner;
MatchSeat loser;
}
class MatchSeat
{
string Id;
Entry Entry;
}
然后设置它,我做了一些辅助函数,它们获取了括号信息并构建了结构。
{ "1", "seed1", "seed4", "W1", "L1" },
{ "2", "seed2", "seed3", "W2", "L2" },
{ "3", "W1", "W2", "W3", "L3" },
{ "4", "L1", "L2", "W4", "L4" },
{ "5", "W4", "L3", "W5", "L5" },
{ "F", "W3", "W5", "WF", "WF" }
然后当填写种子和赢家/输家时,只会在一个地方设置值。
答案 2 :(得分:0)
完整的二叉树怎么样,第一轮从叶节点开始然后向上移动。
答案 3 :(得分:0)
我刚刚在旁边的另一个问题栏中注意到这个问题,并且认为我会说:
我正在开发一个功能齐全的锦标赛API,我正在开源。
它还没有创建双重淘汰赛,但最近修改了单淘汰赛的数据结构,以支持双重淘汰树结构。