9

我正在转换我的 Tournament Organizer 软件,该软件允许创建和操作双淘汰赛,以使用 MVVM 设计模式,以便可以更轻松地对其进行测试。在这样做的过程中,我将“模型”与直接操纵括号结构的 UI 中的一些代码分开。

这将是我为处理锦标赛而编写的第三次迭代软件。第一个是用 PHP 编写的,并将数据存储在数据库中。第二个版本是我做的WPF版本,它把数据存储在内存中,然后序列化成一个XML文件。然而,在这两个版本中,我觉得在实现的某些方面并不干净,并且似乎违反了 DRY 法则。

如果你从头开始创建一个数据结构来处理双重消除括号,你会怎么做?

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

编辑:为了清楚起见,数据结构需要处理双淘汰赛,因此潜在地,一场比赛的获胜者可能最终与另一场比赛的失败者竞争。

4

4 回答 4

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,从获胜者括号第 2 轮中添加 16 个失败者等),但这就是全部实现。数据结构不需要改变来适应它,你只需要更多。

于 2009-02-26T21:52:12.397 回答
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" }

然后,当种子和赢家/输家填写完毕后,该值仅设置在一个位置。

于 2012-04-24T01:33:47.290 回答
0

第一轮从叶节点开始然后向上移动的完整二叉树怎么样?

于 2009-02-26T21:00:23.393 回答
0

我刚刚在我正在回答的另一个问题的侧栏中注意到这个问题,并认为我会插话:

我正在开发一个功能齐全的锦标赛 API,并且我正在开源它。

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

http://tournaments.codeplex.com/

于 2009-10-06T19:17:06.827 回答