在C#中生成一组数字的每个可能组合

时间:2012-05-20 15:05:55

标签: c# math grouping permutation combinations

我正在寻找一种有效的方法来在每种可能的组合中生成数字组合。所以,如果我有一个通用的整数列表(1 - 120),我希望一个结果实际上是从1到120的数字顺序的所有120个数字,然后我需要其他所有组合,其中这些数字的顺序不同

2 个答案:

答案 0 :(得分:2)

对于它的价值,这里是如何使用LINQ和递归对小范围(例如1-8)进行的。

如果你尝试逐步增加范围,你会发现为什么这种方法不起作用。

static void Main(string[] args)
{
    int[][] combinations = GetCombinations(8).Select(c => c.ToArray()).ToArray();
    string s = string.Join("\n", combinations.Select(c => string.Join(",", c)));
    Console.WriteLine(s);
}

static IEnumerable<IEnumerable<int>> GetCombinations(int count)
{
    return GetCombinations(Enumerable.Range(1, count));
}

static IEnumerable<IEnumerable<int>> GetCombinations(IEnumerable<int> elements)
{
    if (elements.Count() == 1)
        return EnumerableSingle(elements);

    return elements.SelectMany((element, index) =>
        GetCombinations(elements.ExceptAt(index)).Select(tail =>
            tail.Prepend(element)));
}

static IEnumerable<T> ExceptAt<T>(this IEnumerable<T> source, int index)
{
    return source.Take(index).Concat(source.Skip(index + 1));
}

static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T element)
{
    return EnumerableSingle(element).Concat(source);
}

static IEnumerable<T> EnumerableSingle<T>(T element)
{
    return Enumerable.Repeat(element, 1);
}

答案 1 :(得分:1)

那么,当你找到一种快速做到这一点的方法时,就去申请诺贝尔奖。

你刚刚打破了所有现代加密机制,这种机制基于类似的原则 - 计算两个(素数)nubmers的每个可能组合的事实是不可能快速的。

如果这是一个家庭作业,你就开玩笑了。如果你真的认为我们没有告诉你一个神奇隐藏的秘密,你就是 - 生活在妄想中。

很抱歉,这是一个毫无意义的问题。

  

我正在寻找一种有效的方法

定义有效率。我现在能看到的最有效的方法是抓住一大堆计算机并用蛮力去寻找它。据推测,NSA现在可以在可接受的时间范围内为128个数字做到这一点;)

如果你的资金有限,那么seonc的另一种选择就是赶时间。放入一台带有太阳能电池板的小型机器,让它计算一段时间。据说,按照世界上的一个真实故事(正如“银河系的Hithhikers指南”中所说的那样,这就是为什么地球存在 - 来向绝对答案者计算问题,即42岁。

第三种方式 - 迄今为止效率最高 - 只是使用42作为答案。如果它适合你就找到了问题,如果不是它只是另一个失败。

抱歉,我不得不认真对待。人们经常会遇到“简单”的数学问题,这些问题只是陷入分解类型的陷阱。