在C#中,我创建了一个包含各种索引列表的列表数组。我想显示2种不同索引组合的1种组合。一个内部的2个组合不得重复。
我正在尝试与14名配对的球员进行网球锦标赛。每位玩家不得两次与其他玩家配对。
答案 0 :(得分:2)
您的问题属于二项式系数的范畴。二项式系数处理在K组中选择具有总共N个项目的唯一组合的问题。
我在C#中编写了一个类来处理使用二项式系数的常用函数。它执行以下任务:
以任意N选择K到文件的格式输出所有K索引。 K-index可以用更具描述性的字符串或字母代替。
将K索引转换为已排序二项系数表中条目的正确索引。这种技术比依赖迭代的旧发布技术快得多。它通过使用Pascal三角形中固有的数学属性来实现这一点,并且与迭代集合相比非常有效。
将已排序的二项系数表中的索引转换为相应的K索引。我相信它也比旧的迭代解决方案更快。
使用Mark Dominus方法计算二项式系数,这样就不太可能溢出并使用更大的数字。
该类是用.NET C#编写的,它提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用名为InitTable的bool值,当为true时,将创建一个通用列表来保存要管理的对象。如果此值为false,则不会创建表。为了使用上述4种方法,不需要创建该表。提供访问者方法来访问该表。
有一个关联的测试类,它显示了如何使用该类及其方法。它已经过2个案例的广泛测试,并且没有已知的错误。
要阅读此课程并下载代码,请参阅Tablizing The Binomial Coeffieicent。
有两种不同的方法可以解释您的问题。在网球比赛中,比赛通常安排使用单次点球,每场比赛的获胜球员前进。然而,一些当地的俱乐部也使用循环赛,每个球员只与对方玩一次,这似乎是你正在看的问题。
所以,问题是 - 如何计算14个玩家(N = 14)可以玩的唯一匹配总数,其中每个玩家只玩一个其他玩家(因此K = 2)。二项式系数计算如下:
唯一组合的总数= N! /(K!*(N - K)!)。的!字符称为因子,表示N *(N-1)*(N-2)... * 1.当K为2时,二项式系数减小为:N *(N-1)/ 2.所以插入14表示N,2表示插入K,我们发现组合总数为91.
以下代码将遍历每个单独的组合:
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字节整数的字大小。
我还应该提一下,由于这是一个课堂项目,你的老师可能不会接受上述答案,因为他可能正在寻找更多的原创作品。在这种情况下,您可能需要考虑使用循环。在提交解决方案之前,您应该与他核实。