C# 双Elmination锦标赛的数据结构
我正在将我的锦标赛组织者软件(允许创建和操作双淘汰赛)转换为使用MVVM设计模式,以便更容易测试。在这样做的过程中,我将“模型”从UI中直接操作括号结构的一些代码中分离出来 这将是我为处理锦标赛而编写的软件的第三次迭代。第一个是用PHP编写的,并将数据存储在数据库中。第二个版本是我制作的WPF版本,它将数据存储在内存中,然后将其序列化为XML文件。然而,在这两个版本中,我觉得实现的某些方面并不干净,似乎它们违反了干法 如果您是从头开始创建一个数据结构来处理双消元括号,您会怎么做? 请注意,它不需要通过算法自动生成括号(从4/8/16/32人预先制定的双重淘汰中加载是我现在的做法),只是设置比赛赢家并通过括号“推进”他们的主要用例C# 双Elmination锦标赛的数据结构,c#,data-structures,mvvm,tdd,tournament,C#,Data Structures,Mvvm,Tdd,Tournament,我正在将我的锦标赛组织者软件(允许创建和操作双淘汰赛)转换为使用MVVM设计模式,以便更容易测试。在这样做的过程中,我将“模型”从UI中直接操作括号结构的一些代码中分离出来 这将是我为处理锦标赛而编写的软件的第三次迭代。第一个是用PHP编写的,并将数据存储在数据库中。第二个版本是我制作的WPF版本,它将数据存储在内存中,然后将其序列化为XML文件。然而,在这两个版本中,我觉得实现的某些方面并不干净,似乎它们违反了干法 如果您是从头开始创建一个数据结构来处理双消元括号,您会怎么做? 请注意,它不需
编辑:为了说明这一点,数据结构需要处理双淘汰赛,因此,一场比赛的赢家可能最终与另一场比赛的输家竞争。第一轮从叶节点开始,然后向上移动的完整二叉树怎么样 所以,在终点,你们有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个输家,等等),那将是很好的,但这就是全部实现。数据结构不需要改变以适应这一点,您只需要更多的数据结构。我刚刚在另一个问题的侧栏中注意到这个问题,我想我应该插话: 我正在开发一个全功能的锦标赛API,我正在开源它 它还没有创建双淘汰赛,但是最近修改了单淘汰赛的数据结构,以支持双elim树结构
我的解决方案是有两组数据结构。一个用于支架部分,一个用于座椅
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" }
然后,当种子和赢家/输家填写完毕后,该值只在一个位置设置。不幸的是,这不适用于双淘汰赛:(这很好,除了需要双淘汰(请参见编辑)是的,我看到并下载了它。不幸的是(幸运的是?),我已经实现了它,所以现在很难返回并重用其他东西:(嗯,你忘记了在回答中实际描述数据结构。