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

时间:2014-04-25 22:58:31

标签: c# algorithm combinations

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

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

例如,如果项目计数为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正如你在顶部看到的,这不是我想要的。如果你想帮忙或者下车,请阅读问题。

度过愉快的一天。

2 个答案:

答案 0 :(得分:0)

由于组合中总是有两个成员,因此应该使用一个简单的嵌套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;
}

再次,请确保您询问您是否理解某事。递归可能是一个非常难以理解的概念!

答案 1 :(得分:0)

你完成了研究吗?谷歌和我得到5分钟(甚至不是那样):

所有这些都会告诉你如何做到这一点。

搜索SO时,您会立即找到这个问题,Algorithm to return all combinations of k elements from n,拥有更多资源(更不用说实际解决方案)了。

如果您是IEEEACM的成员,只需几秒钟搜索他们的在线图书馆,您就可以获得所需的一切。