Java堆栈溢出错误 - 图算法

时间:2012-05-25 02:36:49

标签: java graph hashmap stack-overflow

我用作表示图形的数据结构,HashMap - HashMap(一个用于本地,一个用于表示目的地),我插入了20 000个地点。 现在我需要创建一个函数来知道两个Localities之间是否存在路径,这个函数是递归的,它需要我使用hashMap的很多get对象来处理它们。 对于每个目的地,我总是要执行方法get in my api,给我一个hashMap与目的地的副本 每次运行我的程序时,都会出现Stackoverflow错误。为什么这总是发生?它是由于高递归调用?或者是由于不断调用get方法获得了locality目的地的hashMap的副本?

感谢。

5 个答案:

答案 0 :(得分:2)

堆栈溢出是由递归深度超过某个固定限制引起的。这可能与复制HashMap无关;这将导致OutOfMemoryError。如果您以递归方式执行图搜索,则错误很可能是由

引起的
  1. 深度优先搜索太深,或
  2. 递归逻辑中的错误。
  3. 没有更多数据,我无法说出它是什么。但请注意,DFS可以使用显式堆栈迭代编写,以存储要探索的节点。发布更多代码有助于我们做出更好的诊断。

    希望这有帮助!

答案 1 :(得分:1)

这是递归调用。每个级别的递归调用都会占用堆栈上的空间,因此如果您获得大量这些调用,则会耗尽堆栈空间。将您的算法更改为非递归。

答案 2 :(得分:1)

感谢您的帮助,问题已经解决了。我决定忘记递归调用,并选择DFS变体。

答案 3 :(得分:0)

您使用哪种算法来查找最短路径?它可以包含圆形或负边缘权重吗? 根据这一点,使用Dijktra,Prim,Floyd-Warshall或任何其他。 Steven Skiena的“算法设计手册”,p。 206ff对各种最短路径图算法给出了一些很好的详细解释。我敢肯定,其中很多都是迭代的而不是递归的。

答案 4 :(得分:0)

对于较小的图表,是否会发生同样的事情? 如果是这样,你的递归中有一些错误可能导致无限递归。 如果小图表没有发生,那么这就是你的算法让你失望。