我有一个字符串列表。我有一组数字:
{1,2,3,4}
我需要生成所有组合(?)(字符串)来检查我的列表,组合:
(1,2,3,4),(1234),(1,2,3,4),(123,4),(12,34),(1,2,34),(1, 234),(1,23,4),(1,23),(1,2,3),(1 2),((1 2),(3 4))......等。
随着我的数字变大,这个问题变得越来越大。这是一个使用递归的坏问题是对的吗? (这就是我现在所拥有的)然而,对于迭代解决方案,例如列表的最大大小,空间要求是否更严格?
在终止时,我需要查看每个结果与我的列表匹配的数量,然后查看每个结果的组件数量。 (1)= 1; (1,2)= 2.
我的计算机内存不足(这是对较大对象的问题的抽象)
编辑:所以我的问题是在一个更大的背景下,比如图形,比较700 x 500矩阵中的像素......我的方式不是最有效的方法来做到这一点......?我需要知道对象的嵌套结构以及构成它们的多少预先存在的组件(在我的字符串列表中)
EDIT2:完整的问题描述为here。
答案 0 :(得分:1)
如果这是解决问题的唯一方法(生成所有组合),那么它会变慢,但它并不一定要占用一堆内存。
进行递归时,您希望使用尾递归来优化内存使用。或者只是切换到迭代方法。
如果您需要保存匹配的组合,请确保仅保存组合而不保存对象本身的副本。
作为最后的手段,您可以随时将每个匹配组合附加到文件中以便稍后阅读,然后您根本不会使用大量内存。
所有这些都可以帮助解决你的记忆问题。
答案 1 :(得分:1)
如果你正在获得stackoverflow,那么它确实与使用递归例程有关。这可以通过增加堆栈深度(参见此SO问题:What is the maximum depth of the java call stack?)或使用迭代方法来缓解。
但是,如果您的内存不足,则需要将解决方案存储到磁盘中,或者想出一种将组合存储在更紧凑的数据结构中的方法。
答案 2 :(得分:1)
作为一般规则:当迭代足够时,不要使用递归。
递归使用堆栈,当堆栈已满时,堆栈溢出。如果您通过因子扩展执行某些操作,则堆栈很少会足够大,以使递归解决方案可行。
如果你可以通过循环来完成某些事情,或者使用嵌套循环来代替它。
此外,如果您只是简单地针对某些内容检查每个组合,则不需要存储所有组合的结果(这将占用大量内存),而是与每个组合进行比较,然后将生成的组合抛弃。
答案 3 :(得分:0)
我的计算机内存不足(这是对较大对象的问题的抽象)
如果您的程序的堆栈内存不足,那么您将获得StackOverflowError
。如果你看到它,它表明你的递归算法是错误的方法......或者你有一个错误。 (可能是后者。如果你的算法是正确的,你的最大递归深度应该是基本集合大小N
。)
如果您的程序的堆内存不足,那么您将获得OutOfMemoryError
。如果这就是你所看到的,那么问题就在于你没有足够的堆内存来容纳你正在生成的一组组合。
我认为我们没有足够的信息告诉您解决此问题的最佳方法。如果N很大,那么可能是你的整个计算方法难以处理。