【问题标题】:Generate every possible combination of a set of numbers in C# [closed]在 C# 中生成一组数字的所有可能组合[关闭]
【发布时间】:2012-05-20 15:05:54
【问题描述】:

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

【问题讨论】:

  • 您是否发现或开发了一种效率不足以满足您要求的方法?并且需要帮助改进它(所以可能应该发布它) - 或者这只是一个“请发送代码”请求?
  • 你知道有120个!不同的组合,对吧?以每纳秒 100 万次排列仍需要 1.2e178 年。
  • @helloworld922:那么最好尽快开始。 ;)
  • 无论您尝试解决哪个问题,都可能是 NP 完全问题,这意味着使用蛮力解决(通过枚举整个搜索空间)在计算上是不可行的。您需要提出一种启发式或定向搜索算法来“智能”地解决问题。
  • 6 689 502 913 449 127 057 588 118 054 090 372 586 752 746 333 138 029 810 295 671 352 301 633 557 244 962 989 366 874 165 271 984 981 308 157 637 893 214 090 552 534 408 589 408 121 859 898 481 114 389 650 005 964 960 521 256 960 000 000 000 000 000 000 000 000 000 迭代。

标签: c# math grouping permutation combinations


【解决方案1】:

对于它的价值,以下是使用 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);
}

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2012-04-26
      • 2016-08-16
      • 2017-09-15
      • 2012-08-23
      相关资源
      最近更新 更多