【问题标题】:Limited performance with use of permutation and recursion使用排列和递归的有限性能
【发布时间】:2017-03-24 11:15:53
【问题描述】:

我正在编写一个程序,该程序根据它们的概率计算最长的条纹,并使用递归来获得所有不同的可能场景。这是我正在做的编码挑战:https://open.kattis.com/problems/winningstreak

我注意到,由于递归,当涉及到更大的输入时,我所拥有的置换函数并不是最有效的。示例输入为 3,它会将以下内容添加到匹配数组中: 000, 010, 001, 011, 100,110,101,111

public static void Permutations(string text, int numberOfGames,     List<String> matches)
    {
        if (numberOfGames > 0)
            for (int j = 0; j < 2; j++)
                Permutations(text + j.ToString(), numberOfGames - 1, matches);
        else
        {
            matches.Add(text.ToString());
        }

    }

我的问题在于较大的输入(例如 500),因为这会导致我的程序崩溃并引发错误:垃圾收集器无法为主要堆部分分配 16384 字节的内存。 有没有其他方法可以改进这种递归,使其在更大的输入上运行得更好?

谢谢你们!

【问题讨论】:

  • 您应该添加描述您遇到的异常+堆栈的详细信息。
  • 为了让这个问题成为这里的主题,您需要告诉我们您的程序在哪里崩溃,以及哪些“较大的输入”导致它崩溃。
  • 每个赛季 3000 场比赛.. 震撼
  • 是排列算法崩溃了。输入的示例可以是 500 和任何概率,比如说 0.4。
  • 提示:递归通常可以用迭代代替。

标签: c# recursion permutation repeat


【解决方案1】:

我的问题在于更大的输入(例如 500)

您的程序尝试生成一个包含 2500 个字符串的列表。

宇宙中大约有 2267 个原子。

您的内存不足并不奇怪。

为您的问题找到更聪明的解决方案。

请记住,问题不在于“列举所有可能的游戏组合”。问题是推导出最长条纹长度的期望值。当组合的数量变大时,生成所有可能的组合并总结每个组合中最长条纹的长度是行不通的。

还请记住,问题的陈述是结果必须在确切结果的某个分数范围内。它不一定是确切的结果。在处理这样的谜题时使用元推理:提出谜题的人可能不会让问题放松,除非它是你可以利用的东西。

这是否让您对如何解决问题有所了解?

如果您想了解更多提示和见解,请先阅读以下内容:

http://gato-docs.its.txstate.edu/mathworks/DistributionOfLongestRun.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2016-04-14
    相关资源
    最近更新 更多