【问题标题】:Data structure for Double Elmination Tournament双淘汰赛的数据结构
【发布时间】:2010-10-10 01:04:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# data-structures mvvm tdd tournament


    【解决方案1】:

    因此,在终点,您有 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 个失败者等),但这就是所有实现。数据结构不需要改变来适应它,你只需要更多。

    【讨论】:

    • 效果很好,除了它需要用于双重消除(见编辑)
    【解决方案2】:

    我对此的解决方案是拥有两组数据结构。一个用于支架部分,一个用于座椅。

    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" }
    

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

    【讨论】:

      【解决方案3】:

      如果第一轮从叶节点开始然后向上移动的完整二叉树呢?

      【讨论】:

      • 不幸的是,这不处理双淘汰赛:(
      【解决方案4】:

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

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

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

      http://tournaments.codeplex.com/

      【讨论】:

      • 是的,我看到并下载了它。不幸的是(幸运的是?),我已经开始实施它,所以现在很难回去重新使用其他东西:(
      • 嗯,你忘了在你的答案中真正描述数据结构。
      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2012-05-14
      相关资源
      最近更新 更多