【问题标题】:Need an algorithm to calculate all variations (Combination Calculation) [duplicate]需要一种算法来计算所有变化(组合计算)[重复]
【发布时间】:2014-04-25 22:58:31
【问题描述】:

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

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

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

项目:

{1、2、3、4}

结果集:

{12}、{34}

{13}、{24}

{14}、{23}

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

对于第 6 个项目,输出将是;

项目:

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

结果集:

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,正如您在顶部看到的,这不是我想要的。如果您想提供帮助或只是下车,请阅读问题。

祝你有美好的一天。

【问题讨论】:

  • 很高兴看到您在回答之前尝试解决此问题。作为初学者获得这个算法可能很困难(即使它很简单,但你自己也很难生成),所以我会尽力帮助你(见我的答案)。请确保您了解代码的作用,如果我可以帮助您了解其工作原理,请在 cmets 中提问。

标签: c# algorithm combinations


【解决方案1】:

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

再一次,如果您有什么不明白的地方,请务必询问。递归可能是一个很难理解的概念!

【讨论】:

  • 感谢您的回复 :) 但是对于 6 项;我需要一个包含 15 个项目的列表,每个项目长度为 6 个; 12 34 56 12 35 46 我认为我的问题定义错误,抱歉。
  • @EmreAtaseven,添加了递归解决方案。如果您有任何问题,请告诉我!
  • 感谢代码,我几乎理解它,但它会在集合中创建重复值,我会尝试修改它。谢谢。
【解决方案2】:

你做研究了吗?用谷歌 5 分钟(甚至不是那个),我得到:

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

搜索 SO,你很快就会找到这个问题,Algorithm to return all combinations of k elements from n,它有更多的资源(更不用说实际的解决方案了)。

如果您是 IEEEACM 的成员,只需几秒钟搜索他们的在线图书馆,您就会得到几乎所有您需要的东西。

【讨论】:

  • 你读过问题吗? 5 分钟(甚至不到)阅读并理解它们是完全不同的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多