双淘汰赛的数据结构
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/
【讨论】:
是的,我看到并下载了它。不幸的是(幸运的是?),我已经开始实施它,所以现在很难回去重新使用其他东西:( 嗯,你忘了在你的答案中真正描述数据结构。以上是关于双淘汰赛的数据结构的主要内容,如果未能解决你的问题,请参考以下文章