订购的唯一组合

本文关键字:组合 唯一 | 更新日期: 2023-09-27 17:51:08

我有以下类:

internal class Course
{
    public int CourseCode { get; set; }
    public string DeptCode { get; set; }
    public string Name { get; set; }
}

和下面的代码是我的二维数组:

Course[][] courses = new Course[3][];
courses[0] = new Course[] {
   new Course() { CourseCode = 100, DeptCode = "EGR", Name = "EGR A" },
   new Course() { CourseCode = 100, DeptCode = "EGR", Name = "EGR B" }
};
courses[1] = new Course[] {
   new Course() { CourseCode = 200, DeptCode = "EN", Name = "EN A" }
};
courses[2] = new Course[] {
   new Course() { CourseCode = 300, DeptCode = "PHY", Name = "PHY A" }
};

我想做的是得到一组中每个项目可以与其他组进行的不同组合;例如,使用前面的代码,结果将是:

1. EGR A - EN A - PHY A
2. EGR B - EN A - PHY A

回答:为了得到可能的组合数量,我们可以使用乘积法则,在上面的例子中,可能的组合将是(2 * 1 * 1)= 2,这确实是我上面写的两种组合。

LordTakkera给出了完美的答案,非常感谢!

订购的唯一组合

可以使用嵌套的for循环:

for (int i = 0; i < courses[0].Length; i++)
{
   for (int j = 0; j < courses[1].Length; i++)
   {
     for (int k = 0; k < courses[2].Length; i++)
     {
         //Do whatever you need with the combo, accessed like:
         //courses[0][i], courses[1][j], courses[2][k]
     }
   }
}

当然,你需要的嵌套越多,这个解决方案就越混乱。如果您需要更深入地研究,我将使用某种递归函数来遍历集合并生成组合。

应该是这样的:

class CombinationHelper
{
    public List<List<Course>> GetAllCombinations(Course[][] courses)
    {
            return GetCourseCombination(courses, 0);
    }
    public List<List<Course>> GetCourseCombination(Course[][] courses, int myIndex)
    {
        List<List<Course>> combos = new List<List<Course>>();
        for (int i = 0; i < courses[myIndex].Length; i++)
        {
            if (myIndex + 1 < courses.GetLength(0))
            {
               foreach (List<Course> combo in GetCourseCombination(courses, myIndex + 1))
               {
                  combo.Add(courses[myIndex][i]);
                  combos.Add(combo);
               }
            }
            else
            {
               List<Course> newCombination = new List<Course>() { courses[myIndex][i] };
               combos.Add(newCombination);
            }
        }
        return combos;
    }
}

我对此进行了测试(将"Course"替换为"int"以使验证更容易),它产生了所有8种组合(尽管不是按顺序,递归倾向于这样做)。如果我想出了排序代码,我会发布的,但它不应该是困难)。

递归函数对我来说已经够难的了,所以我的解释不会很好。基本上,我们从"0"索引开始(这样我们就从头开始)。然后遍历当前数组。如果我们不是"主"数组中的最后一个数组,我们递归到下一个子数组。否则,我们创建一个新的组合,将我们自己加入其中,然后返回。

当递归堆栈"展开"时,我们将生成的组合添加到返回列表中,将我们自己添加到其中,然后再次返回。最终,整个过程"展开",你将得到一个包含所有组合的列表。

再一次,我确信这是一个非常令人困惑的解释,但递归算法(至少对我来说)本质上令人困惑。

我很乐意尝试详细说明你想要的任何一点。

查看第二个索引- 0或1。如果你只看这个,你会看到一个从0到7的二进制数。

从0数到7,把它转换成比特,得到你需要的组合模式