0

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

4

2 回答 2

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);
}
于 2012-05-20T15:50:59.623 回答
1

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

您刚刚破坏了基于类似原理的所有现代加密机制 - 事实上,不可能快速计算两个(主要)数字的每个可能组合。

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

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

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

定义高效。我现在能看到的最有效的方法是抓住大量计算机并用蛮力进行。据说 NSA 现在可以在可接受的时间范围内为 128 个号码做到这一点;)

如果你的钱有限,最好的选择是争取时间。在某处放入一台带有太阳能电池板的小型机器,让它计算一段时间。据说根据世界的一个真实故事(如“银河系徒步旅行者指南”中所述),这就是地球存在的原因 - 计算出绝对答案者的问题,即 42。

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

对不起,我不得不让这不严重。人们经常提出“简单”的数学问题,这些问题只是落入因式分解类型的陷阱。

于 2012-05-20T15:32:04.953 回答