【问题标题】:Combinations Algorithm for 3 groups of more values3组更多值的组合算法
【发布时间】:2013-07-16 22:49:28
【问题描述】:

我需要创建一个程序,让我能够为三个或更多组唯一地获得三个重复值的完整组合。

例如我可以有3组(R1 - R2 - R3)和三个值(A - AB - B),我必须将所有可能的组合分成3组。

像这样:

Groups    1°   2°   3°   4°   5°   .......

R1        A -  A -  AB - AB - AB   ...
R2        A -  A -  A  - A  - BB   ...
R3        A -  AB - A  - A  - A    ...

我必须确保所有可能的序列都存在并且永远不会重复。

不幸的是,我是编程领域的新手,对组合学一无所知。我不知道如何处理它......

如果我不清楚,我深表歉意,并提前感谢任何能给我帮助的人。

【问题讨论】:

  • 你能解释一下3组是什么意思吗?
  • 抱歉,不确定您的问题。
  • “重复排列”是您要查找的谷歌查询
  • 不清楚如何将“BB”作为示例输出中的值之一。如果可以,我建议您尝试用正式语言准确解释您的问题的输入和输出。我有一种感觉,所需的算法类似于从一组 n 项中枚举大小 k 的组合,这是一个经过充分研究和理解的算法类,所以有人可能会帮助你,但不清楚我正是你的问题是什么
  • 对不起,我的错误......我的例子中的BB是错误的,我的意思是只有B。但我只使用这个值作为参考,AA - AB - BB 更准确。

标签: c# vb.net algorithm combinations


【解决方案1】:

我认为你想要你的价值观的所有组合....

这是在 C# 中执行此操作的通用方法...

static IEnumerable<IEnumerable<T>> Combinations<T>(IEnumerable<T> list, int length)
{
    if (length == 1) return list.Select(t => new T[] { t });

    return Combinations(list, length - 1)
        .SelectMany(t => list, (t1, t2) => t1.Concat(new T[] { t2 }));
}

你这样称呼它......

    var groups = new List<string>() { "R1", "R2", "R3" };
    var values = new List<string>() { "AA", "AB", "BB" };
    var combinations = Combinations(values, groups.Count);
    var i = 0;
    var stringFormat =  string.Join(", ", groups.Select(x => x +"={"+ i++ +"}"));
    // stringFormat looks like "R1={0}, R2={1}, R3={2}"
    foreach (var value in combinations)
    {
        var arrayOfValues = value.ToArray();  // each value is a list of the combinations.
        Console.WriteLine(string.Format(stringFormat, arrayOfValues));
    }

您提到了您的经验不足,因此我将其包含在硬编码的方式中,这种方式更容易遵循...

    var values = new List<string>() { "AA", "AB", "BB" };
    foreach (var value1 in values)
    {
        foreach (var value2 in values)
        {
            foreach (var value3 in values)
            {
                Console.WriteLine(string.Format("R1 = {0}, R2 = {1}, R3 = {2}", value1, value2, value3));
            }
        }
    }

输出看起来像这样......

R1=AA, R2=AA, R3=AA
R1=AA, R2=AA, R3=AB
R1=AA, R2=AA, R3=BB
R1=AA, R2=AB, R3=AA
R1=AA, R2=AB, R3=AB
R1=AA, R2=AB, R3=BB
R1=AA, R2=BB, R3=AA
R1=AA, R2=BB, R3=AB
R1=AA, R2=BB, R3=BB
R1=AB, R2=AA, R3=AA
R1=AB, R2=AA, R3=AB
R1=AB, R2=AA, R3=BB
R1=AB, R2=AB, R3=AA
R1=AB, R2=AB, R3=AB
R1=AB, R2=AB, R3=BB
R1=AB, R2=BB, R3=AA
R1=AB, R2=BB, R3=AB
R1=AB, R2=BB, R3=BB
R1=BB, R2=AA, R3=AA
R1=BB, R2=AA, R3=AB
R1=BB, R2=AA, R3=BB
R1=BB, R2=AB, R3=AA
R1=BB, R2=AB, R3=AB
R1=BB, R2=AB, R3=BB
R1=BB, R2=BB, R3=AA
R1=BB, R2=BB, R3=AB
R1=BB, R2=BB, R3=BB

【讨论】:

  • 我正在做一些测试,我认为您建议的第一种方法可以解决我的问题。现在,谢谢你,如果问题完全解决,我会尽快给你反馈。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2014-06-19
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多