双重淘汰赛的数据结构

时间:2009-02-26 09:46:33

标签: c# data-structures mvvm tdd tournament

我正在转换我的Tournament Organizer软件,允许创建和操作Double Elimination Tournaments,使用MVVM设计模式,以便更容易测试。在这样做的时候,我将'模型'与UI中直接操作括号结构的一些代码分开。

这将是我为处理锦标赛而编写的软件的第三次迭代。第一个是用PHP编写的,并将数据存储在数据库中。第二个版本是我制作的WPF版本,它将数据存储在内存中,然后将其序列化为XML文件。但是,在这两个版本中,我认为实施的各个方面都不干净,而且看起来它们违反了DRY法则。

如果您是从头开始创建数据结构来处理双重删除括号,那么您将如何做?

请注意,它不需要能够在算法上自动生成括号(从4/8/16/32人预先制作的双重消除加载是我现在正在做的方式),只是设置比赛获胜者并通过括号“推进”它们的主要用例。

编辑:为了说清楚,数据结构需要处理双重淘汰锦标赛,因此,一场比赛的胜利者最终可能会与另一场比赛的输家竞争。

4 个答案:

答案 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,我正在开源。

它还没有创建双重淘汰赛,但最近修改了单淘汰赛的数据结构,以支持双重淘汰树结构。

http://tournaments.codeplex.com/