2017-03-14 27 views
0

我一直在編碼一個遞歸算法,以便通過不同的節點並分析有向非循環圖中的所有路徑。問題是,在將一些新數據引入算法後,我收到了此消息Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError。我已經通過關於這個問題的不同問題進行了研究,看來這個錯誤是因爲內存不足。任何人都可以幫我解決這個問題嗎?遞歸算法和StackOverFlow錯誤

這裏我想補充的遞歸算法的圖片:

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)))的條件,但我不明白爲什麼它的工作原理與某些數據並不總是沒有那麼多的信息已經變了。

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

回答

0

StackOverflowError發生,因爲你遞歸太多次了。如果遞歸調用太多,這意味着在終止條件中存在缺陷或不正確的假設。這裏是你的終止條件:

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

由於您沒有提供足夠的信息與你的問題爲我們進一步分析圖表或節點,我建議你把這個終止條件仔細一看,並確保圖的每次遍歷都將最終滿足這個條件。

調試器的使用還可以幫助您逐步遍歷並查看循環發生的位置以及爲什麼它無法滿足終端條件。

0

你遍歷中似乎效率不高,因爲你是計算每每一個節點,你有多少次訪問重複和你通過添加一些maxRep

限制你的努力,所有你需要的是一組訪問節點,而不是當你訪問它時爲每個節點增加一個計數器。

你的DAG有很多根嗎?缺乏週期保證,還是需要檢測週期?

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