簡體   English   中英

遞歸算法和StackOverFlow錯誤

[英]Recursive algorithms and StackOverFlow Error

我一直在編寫一個遞歸算法,以遍歷不同的節點並分析有向無環圖中的所有路徑。 事實是,在將一些新數據引入算法后,我Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError得到了此消息Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 我瀏覽了有關此問題的不同問題,似乎該錯誤是由於內存不足所致。 誰能幫我解決這個問題?

在這里,我添加了遞歸算法的圖片:

public boolean checkduration(Node node, double dur, int freq){
    boolean outcome=true;
    currentPath.add(node);
    if((dur>minduration)&&(node.getRep()<=node.getMaxRep())){
        ArrayList<Node> clone = (ArrayList<Node>) currentPath.clone();
        currentPath2=clone;
        failingPaths.add(new ImmutableTriple<Double,Integer, ArrayList<Node>> (dur,freq,currentPath2)); 
        currentPath.remove(node);
        return false;
    }
    node.setRep(node.getRep()+1);

    for(int i=0;i<node.getEdge().size();i++){
        if(!checkduration(node.getEdge().get(i).previousNode,dur+node.getEdge().get(i).timeRelation, freq+node.getEdge().get(i).frequency)){
            outcome=false;  
        }
    }
    currentPath.remove(node);
    node.setRep(node.getRep()-1);
    return outcome;
 }

該錯誤似乎是在(if(!checkduration(node.getEdge().get(i).previousNode,dur+node.getEdge().get(i).timeRelation, freq+node.getEdge().get(i).frequency)))但我不明白為什么它可以處理某些數據,但並非總是如此,因為沒有太多信息被更改。

任何意見,建議將是真正有幫助的。 謝謝大家

發生StackOverflowError的原因是遞歸次數過多。 如果遞歸調用過多,則意味着終止條件存在缺陷或錯誤的假設。 這是您的終止條件:

(dur > minduration) && (node.getRep() <= node.getMaxRep())

由於您沒有為我們的問題提供足夠的信息來進一步分析圖或節點,因此建議您仔細研究此終止條件,並確保圖的所有遍歷最終都將滿足此條件。

使用調試器還可以幫助您逐步遍歷遍歷,查看循環發生在何處以及為什么循環無法滿足最終條件。

由於遍歷每個節點的重復次數,訪問了多少次並通過添加一些maxRep來限制工作量,因此圖形遍歷效率似乎較低

您所需要的只是訪問的節點集,而不是訪問節點時每個節點的計數器增量。

您的DAG有很多根嗎? 是否可以保證缺乏周期,還是需要檢測周期?

另請注意,您不需要克隆路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM