使用排列和递归时性能有限
Limited performance with use of permutation and recursion
我正在编写一个程序来计算最长连胜概率,并使用递归来获得所有不同的可能场景。这是我正在做的编码挑战:https://open.kattis.com/problems/winningstreak
我注意到,由于递归,当涉及到更大的输入时,我拥有的置换函数并不是最有效的。一个示例输入是 3,它会将以下内容添加到 matches 数组中:
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 字节的内存。
有没有其他方法可以改进此递归,使其在更大的输入上运行得更好?
谢谢大家!
My problem lies with larger inputs (example 500)
您的程序试图生成一个包含 2500 个字符串的列表。
宇宙中大约有2267个原子。
我发现你 运行 内存不足并不奇怪。
为您的问题找到更聪明的解决方案。
记住,问题不是"enumerate all possible combinations of games"。问题是推导出最长连胜长度的期望值。当组合数量变大时,生成所有可能的组合并求和每个组合中最长连胜的长度是行不通的。
还要记住,问题的陈述是结果 必须在精确结果 的某个分数之内。它不一定是准确的结果。在处理这样的谜题时使用元推理:提出谜题的人可能不会放松问题,除非你可以利用它。
这是否让您对如何解决问题有了一些了解?
如果您需要更多提示和见解,请先阅读以下内容:
http://gato-docs.its.txstate.edu/mathworks/DistributionOfLongestRun.pdf
我正在编写一个程序来计算最长连胜概率,并使用递归来获得所有不同的可能场景。这是我正在做的编码挑战:https://open.kattis.com/problems/winningstreak
我注意到,由于递归,当涉及到更大的输入时,我拥有的置换函数并不是最有效的。一个示例输入是 3,它会将以下内容添加到 matches 数组中: 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 字节的内存。 有没有其他方法可以改进此递归,使其在更大的输入上运行得更好?
谢谢大家!
My problem lies with larger inputs (example 500)
您的程序试图生成一个包含 2500 个字符串的列表。
宇宙中大约有2267个原子。
我发现你 运行 内存不足并不奇怪。
为您的问题找到更聪明的解决方案。
记住,问题不是"enumerate all possible combinations of games"。问题是推导出最长连胜长度的期望值。当组合数量变大时,生成所有可能的组合并求和每个组合中最长连胜的长度是行不通的。
还要记住,问题的陈述是结果 必须在精确结果 的某个分数之内。它不一定是准确的结果。在处理这样的谜题时使用元推理:提出谜题的人可能不会放松问题,除非你可以利用它。
这是否让您对如何解决问题有了一些了解?
如果您需要更多提示和见解,请先阅读以下内容:
http://gato-docs.its.txstate.edu/mathworks/DistributionOfLongestRun.pdf