我正在做一个应该加载具有200k顶点和500k边缘的图形的程序。然后,我需要查看靠近顶点一定距离的顶点(它们都具有特定的ubication)。我通过递归(DFS)这样做,但是,对于足够大的数量,我必须通过的递归足以使程序崩溃(堆栈溢出)。我一直在阅读它,并且有一个共识是这个错误是一个错误的编程问题,而不是数据问题的大小。我可以增加堆栈空间并且它可以工作,但是我想知道我是否可以更改我的DFS实现以使其不那么重。我还想知道堆栈中每个元素的“权重”是否由递归决定(它是否创建了新的变量?它会崩溃的原因是什么?)
如果有人可以帮助我,我会非常感激!!
答案 0 :(得分:4)
崩溃是由于使用大小有限的特定于线程的堆栈引起的。你不会远离那个。
每次调用一个方法时,方法的参数和其他信息都会被放在堆栈中,并且它会一直存在,直到方法返回,即使值被修改。使用递归调用,这意味着每次递归都会增加使用的堆栈空间量。
每个重复的解决方案都可以修改为迭代解决方案,但实现起来可能很棘手。
答案 1 :(得分:1)
由递归算法引起的堆栈溢出通常表示编程错误(这可能是“错误编程问题”的意思)。这是因为这样的堆栈溢出通常是因为程序员未能确保递归总是终止。
但是,有可能从基本正确的程序中产生堆栈溢出,当向它提供足够大的数据时,它会在达到递归终止条件之前耗尽堆栈。然而,人们仍然可以将其描述为编程错误:程序实现不适合预期能够处理的某些输入。从这个意义上讲,您无法将数据大小问题与编程问题分开。如果你的程序需要遍历图中的非常长的路径(“非常长”的定义是模糊的)那么递归算法可能是一个糟糕的选择。如果DFS确实是问题的良好匹配,那么迭代实现它并不困难。