【问题标题】:Why do I get StackOverFlowError when trying to DFS this graph for finding strongly connected component?为什么在尝试对此图进行 DFS 以查找强连接组件时会出现 StackOverFlowError?
【发布时间】:2018-05-12 04:46:45
【问题描述】:

我正在尝试编写一个算法来确定一个图是否是强连接的。我认为我的代码几乎是正确的,尽管我不断收到 StackOverFlowError。我个人认为,因为我正在测试我的算法的图表中有一个循环,所以我的代码不理解它并进入一个循环。但是我正在使用一个数组来查看一个节点是否已经被访问过!所以这不应该发生!请帮助我了解我的代码有什么问题。无论如何,这是我的代码:

 static void dfs(int src,boolean[] visited,Stack<Integer> stack){
        visited[src]=true;
        for(Integer i:adj[src]){
            if(!visited[i]){
                dfs(i,visited,stack);
            }
        }
        stack.push(src);
    }

这就是我从 main 调用我的 DFS 函数的方式:

Stack<Integer> stack=new Stack<Integer>();
    boolean[] visited=new boolean[n+1];
    for(int i=1;i<=n;i++){
        if(!visited[i]){
            g.dfs(i,visited,stack);
        }
    }

【问题讨论】:

  • 也许这会对你有所帮助:stackoverflow.com/questions/34553782/…
  • 您正在使用src 更新visited 我猜是节点号? g 定义在哪里? if(!visited[i]){ g.dfs(i,visited,stack); 我也不清楚:如果您想从每个可能的节点启动 dfs,请忽略 visited。请发帖minimal reproducible example 这样我们就不用猜了。

标签: java graph stack-overflow depth-first-search strongly-connected-graph


【解决方案1】:

有两种可能的解释:

  1. 存在循环,您的循环检测代码不起作用。
  2. 图形太深;即,如果堆栈更大,您的代码将可以工作。

看你的代码,我认为第二种解释是正确的。

示例:假设您的图表实际上是一条由 N 个节点组成的链。要到达列表中的最后一个节点,您需要进行 N 深的递归调用。对于足够大的 N,这将导致堆栈溢出。

【讨论】:

  • 问题的约束是:1 ≤ N ≤ 10^5 我认为这样的堆栈空间不足以导致堆栈溢出错误。有什么办法可以克服这种情况吗?
  • @ShreyaJain 您可以应用非递归 dfs,或按间隔运行递归。查看示例here
  • “我认为这样的堆栈空间不够大,不会导致 stackoverflow 错误” 我没有。 “有什么解决方案可以克服这种情况吗?” 使用显式堆栈数据结构而不是递归。
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 2013-01-02
  • 2012-03-09
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2013-01-03
  • 2013-03-07
相关资源
最近更新 更多