需要一个算法来计算所有变化(组合计算)

本文关键字:计算所 有变化 组合 计算 一个 算法 | 更新日期: 2023-09-27 18:00:26

我有一个列表,它的项目数总是偶数。

我需要一个算法来找到所有两个成员的组合。

例如,如果项目计数为4,则输出为;

项目:

{1,2,3,4}

ResulSet:

{12} ,{34}

{13} ,{24}

{14} ,{23}

顺序没有区别,{12}涵盖了{21}。

对于项目计数6,输出将为;

项目:

{1,2,3,4,5,6}

ResulSet:

12 34 56

12 35 46

12 36 45

13 24 56

13 25 46

13 26 45

14 23 56

14 25 36

14 26 35

15 23 46

15 24 36

15 26 34

16 23 45

16 24 35

16 25 34

你能给我指一条路吗?

谢谢。

编辑:

这个问题读起来很短,如果你花1分钟的时间读这个问题,你会发现它并不像大多数人认为的那样重复(可能他们是半文盲)

{1,2,3,4,5,6}的组合是

123456,正如您在顶部看到的,这不是我想要的。若你们想帮忙或下车,请阅读问题。

祝你今天愉快。

需要一个算法来计算所有变化(组合计算)

由于组合中总是有两个成员,因此一个简单的嵌套for循环应该可以工作:

for (int i = 0; i < data.Length - 1; i++)
   for (int j = i + 1; j < data.Length; j++
      Console.WriteLine({0}{1}, i, j);

我们迭代列表中的每个项目,直到倒数第二个项目(因为我们不能有1个数字组合)。在这些迭代中,我们从外部迭代变量加1(没有重复元素)一直迭代到列表的末尾。

这将生成所有唯一的组合。不过,要进行两个或三个以上的成员输出,您需要研究递归。我将把输出的格式设置为与您的问题相匹配,作为读者的练习:)。

对于6个元素的组合,我们将不得不深入研究递归的狂野世界。递归真的会扰乱你的头脑,所以如果你不明白什么,请问一下。递归的一般原理是:"用第一个元素做一些事情,调用自己并传递其余的"。在这种情况下,代码看起来像:

public List<List<int>> GetAllCombos (int[] values)
{
    //Kick it off with the 0 index
    return GetCombos(values, 0);
}
private List<List<int>> GetCombos(int[] values, int myIndex)
{
    //A holder for combinations from this index onward
    List<List<int>> combos = new List<List<int>>();
    for (int i = myIndex; i < values.Length; i++)
    {
        if (myIndex + 1 < values.Length)
        {
            foreach (List<int> combo in GetCombos(values, myIndex + 1))
            {
               combo.Add(values[myIndex][i]);
               combos.Add(combo);
            }
        }
        else
        {
           List<int> newCombination = new List<int>() { values[myIndex][i] };
           combos.Add(newCombination);
        }
    }
    return combos;
}

再说一遍,如果你不明白什么,请一定要问。递归可能是一个很难理解的概念!

你做过研究吗?5分钟(甚至不是那样)与谷歌和我得到:

  • 生成置换和组合
  • 排列和组合的算法
  • 基于树的计算k-组合和k+/em>-组合的算法
  • 组合算法

所有这些都将向你展示如何做到这一点。

搜索SO,你很快就会发现这个问题,返回n中k个元素的所有组合的算法,甚至有更多的资源(更不用说实际的解决方案)。

如果你是IEEE或ACM的成员,几秒钟搜索他们的在线图书馆就会得到你所需要的一切。