4

我使用 HashMap - HashMap 作为数据结构来表示图形(一个用于本地,一个在本地内部以表示目的地),我已经插入了 20 000 个本地。现在我需要创建一个函数来知道两个 Localities 之间是否存在路径,这个函数是递归的,它需要我做很多我的 hashMap 的 get 对象来使用它们。对于每个要制作的目的地,我总是要在我的 api 中执行 get 方法,给我一份带有目的地的 hashMap 副本每次我运行我的程序时,我都会收到 Stackoverflow 错误。为什么这总是发生?这是由于高递归调用?还是因为不断调用 get 方法来获得本地目的地的 hashMap 副本?

谢谢。

4

5 回答 5

2

堆栈溢出是由递归深度超过某个固定限制引起的。HashMap这可能与复制;无关。这会导致OutOfMemoryError. 如果您正在递归地进行图形搜索,则错误可能是由以下任一原因引起的

  1. 深度优先搜索过深,或
  2. 递归逻辑中的错误。

没有更多数据,我不能说它是哪个。但是请注意,可以使用显式堆栈迭代地编写 DFS 来存储要探索的节点。发布更多代码将有助于我们做出更好的诊断。

希望这可以帮助!

于 2012-05-25T02:40:11.340 回答
1

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

于 2012-05-25T02:40:44.877 回答
1

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

于 2012-05-26T16:15:32.440 回答
0

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

于 2012-05-25T02:52:55.673 回答
0

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

于 2012-05-25T02:49:41.433 回答