在 C# 中,我创建了一个包含各种索引列表的列表数组。我想显示 2 种不同索引组合的 1 种组合。一个里面的2个组合不能重复。
我正在尝试编写一个有 14 名配对球员的网球锦标赛。每个玩家不得与另一位玩家配对两次。
在 C# 中,我创建了一个包含各种索引列表的列表数组。我想显示 2 种不同索引组合的 1 种组合。一个里面的2个组合不能重复。
我正在尝试编写一个有 14 名配对球员的网球锦标赛。每个玩家不得与另一位玩家配对两次。
您的问题属于二项式系数的范围。二项式系数处理在总共有 N 个项目的 K 组中选择唯一组合的问题。
我用 C# 编写了一个类来处理处理二项式系数的常用函数。它执行以下任务:
将任何 N 选择 K 的所有 K 索引以良好的格式输出到文件。K-indexes 可以替换为更具描述性的字符串或字母。
将 K 索引转换为已排序二项式系数表中条目的正确索引。这种技术比依赖迭代的旧已发布技术快得多。它通过使用帕斯卡三角形中固有的数学属性来做到这一点,并且与迭代集合相比非常有效。
将已排序二项式系数表中的索引转换为相应的 K 索引。我相信它也比旧的迭代解决方案更快。
使用Mark Dominus方法计算二项式系数,它不太可能溢出并且适用于更大的数字。
该类是用 .NET C# 编写的,并提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用一个名为 InitTable 的 bool 值,当它为 true 时,将创建一个通用列表来保存要管理的对象。如果此值为 false,则不会创建表。无需创建表即可使用上述 4 种方法。提供了访问器方法来访问表。
有一个关联的测试类,它显示了如何使用该类及其方法。它已经用 2 个案例进行了广泛的测试,并且没有已知的错误。
要了解此类并下载代码,请参阅制表二项式系数。
有两种不同的方式来解释您的问题。在网球比赛中,锦标赛通常安排为使用单次淘汰,每场比赛的获胜者晋级。但是,一些本地俱乐部也使用循环赛,每个球员只与其他球员比赛一次,这似乎是您正在寻找的问题。
所以,问题是 - 如何计算可以与 14 名玩家(N = 14)一起玩的独特比赛的总数,其中每个玩家只玩另一个玩家(因此 K = 2)。二项式系数计算如下:
唯一组合的总数 = N!/(K!*(N - K)!)。这 !字符称为阶乘,表示 N * (N-1) * (N-2) ... * 1。当 K 为 2 时,二项式系数减少为:N * (N - 1) / 2。所以,N 代入 14,K 代入 2,我们发现组合的总数为 91。
以下代码将遍历每个 uniue 组合:
int N = 14; // Total number of elements in the set.
int K = 2; // Total number of elements in each group.
// Create the bin coeff object required to get all
// the combos for this N choose K combination.
BinCoeff<int> BC = new BinCoeff<int>(N, K, false);
int NumCombos = BinCoeff<int>.GetBinCoeff(N, K);
// The Kindexes array specifies the 2 players, starting with index 0.
int[] KIndexes = new int[K];
// Loop thru all the combinations for this N choose K case.
for (int Combo = 0; Combo < NumCombos; Combo++)
{
// Get the k-indexes for this combination.
BC.GetKIndexes(Loop, KIndexes);
// KIndex[0] is the first player & Kindex[2] is the 2nd player.
// Print out the indexes for both players.
String S = "Player1 = Kindexes[0].ToString() + ", " +
"Player2 = Kindexes[1].ToString();
Console.WriteLine(S};
}
你应该能够很容易地将这个类移植到你选择的语言上。您可能不必移植类的通用部分来实现您的目标。根据您使用的组合数量,您可能需要使用比 4 字节整数更大的字长。
我还应该提到,由于这是一个课堂项目,您的老师可能不会接受上述答案,因为他可能正在寻找更多原创作品。在这种情况下,您可能需要考虑使用循环。在提交解决方案之前,您应该与他核实。