【问题标题】:How can calculate combinations on 2nd level array?如何计算二级数组的组合?
【发布时间】:2014-06-02 15:59:29
【问题描述】:

抱歉,如果问题不清楚。我不知道如何构建它。 我需要计算给定数组的所有可能组合。我最好做一个图形示例:

a,b,c

0,1,2,3

0

A,B

0,1,2

可能的结果是: a00A0 和 b00A0 和 b30B1....

所以基本上它为每个位置旋转每个数组并构建所有可能的字符串。就像试图打开我们小时候忘记钥匙的 3 位数密码链之一。

【问题讨论】:

  • 您是在寻找可能的组合数量,还是在寻找所有可能性?
  • 这不是唯一的方法,而是考虑递归解决方案。你基本上是在穿过一棵树
  • 我不是专门从事数学编程的,所以我基本上开始构建数组并计算可能的元素矩阵(冗余)并且在尝试构建一些循环和递归函数时失去了焦点......所以什么都没有.
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 为什么不简单地使用 5 个嵌套循环呢?或者你想要一个通用的解决方案?

标签: c# arrays combinations


【解决方案1】:

您正在寻找的是在编译时未定义的多个序列的笛卡尔积。

Eric Lippert 在this blog post 中描述了如何解决这个问题。

那篇文章的代码如下:

static IEnumerable<IEnumerable<T>> CartesianProduct<T>
    (this IEnumerable<IEnumerable<T>> sequences)
{
    IEnumerable<IEnumerable<T>> emptyProduct =
        new[] { Enumerable.Empty<T>() };
    return sequences.Aggregate(
        emptyProduct,
        (accumulator, sequence) =>
            from accseq in accumulator
            from item in sequence
            select accseq.Concat(new[] { item }));
}

然后你可以将你的序列序列传递给这个函数,并得到所有可能组合的序列。

【讨论】:

  • 非常感谢。你能详细说明吗?好尴尬,但看着它,我什至不知道如何称呼它。或者,如果这正是我在为其制作新项目之前所需要的。 ;)(而且我应该拥有一个使用线性数学计算核心的混合解决方案。我老了)
  • @Sergio 正如我在回答中所说,您传入一个序列序列,然后得到一个组合序列(每个组合都是一个序列)。你就是这样称呼它的。您目前有 N 个序列。把它们都放到一个序列中来调用它。
  • 如果我错了,请纠正我,但这似乎是 IEnumerable 的扩展。所以它可能会扩展一个 Enumerable 的?可枚举的字符?
  • @Sergio 这是IEnumerable&lt;IEnumearble&lt;T&gt;&gt; 的扩展,而不是IEnumerable&lt;T&gt;。这意味着你需要有一个序列的序列,而不仅仅是一个序列。
  • 对,只是想弄清楚如何重做我拥有的所有 ArrayLists 构建。那是另一个单独的 odisea。
猜你喜欢
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
相关资源
最近更新 更多