Java堆栈溢出错误 - 图算法

4
我正在使用HashMap(一个用于表示位置,另一个用于表示目的地),将其作为表示图形的数据结构。我已经插入了20000个位置。现在我需要编写一个函数来确定两个位置之间是否存在路径。该函数是递归的,并且需要我多次使用get对象从我的HashMap中获取它们来进行处理。对于每个目的地,我总是要执行api中的get方法,以便获得带有目的地的HashMap的副本。每次运行程序时,我都会收到Stackoverflow错误。这种情况为什么总是发生?是由于高递归调用还是由于不断调用get方法以获得位置目的地的HashMap副本?谢谢。

1
你能贴一些代码吗?这将使诊断问题更容易。 - Hunter McMillen
糟糕,我误以为你指的是网站,已经删除了stackoverflow标签 :) 正如@HunterMcMillen所说,如果您发布代码,我们将能够提供更多帮助。 - NominSim
5个回答

2
堆栈溢出是由于递归深度超过某个固定限制引起的。这可能与复制HashMap无关,否则会导致OutOfMemoryError。如果您正在递归进行图形搜索,则错误可能是由以下原因之一引起的:
  1. 深度优先搜索太深了,或者
  2. 递归逻辑中存在错误。
没有更多数据,我无法确定是哪一个。请注意,DFS可以使用显式堆栈迭代地编写以存储要探索的节点。发布更多代码将有助于我们做出更好的诊断。
希望这可以帮助!

1

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


1

感谢您的帮助,问题已经解决。我决定放弃递归调用,并选择深度优先搜索变体。


0
你使用哪个算法来寻找最短路径?它可以包含圆圈或负边权吗? 根据情况,使用Dijktra、Prim、Floyd-Warshall或其他算法。Steven Skiena的《算法设计手册》第206页及以下提供了有关各种最短路径图算法的详细解释。我相信,其中许多是迭代而不是递归的。

0

对于更小的图形是否发生了同样的事情? 如果是这样,那么您的递归中可能存在一些错误,导致无限递归。 如果对于较小的图形没有发生这种情况,那么这就是您的算法让您失败了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接