双淘汰赛的数据结构

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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/

【讨论】:

是的,我看到并下载了它。不幸的是(幸运的是?),我已经开始实施它,所以现在很难回去重新使用其他东西:( 嗯,你忘了在你的答案中真正描述数据结构。

以上是关于双淘汰赛的数据结构的主要内容,如果未能解决你的问题,请参考以下文章

缓存数据库双写一致性问题

数据库面试题——redis缓存主动更新策略(延时双删)

洛谷 P4715 淘汰赛,数据结构

淘汰赛确定下拉列表选择并将文本更新到数据库

淘汰赛 + 大数据集性能

淘汰赛中的数据绑定不适用于多个属性