2014-04-17 3 views
0

그래프에 DFS를 실행하는 코드를 작성하고 있지만 그래프가 큽니다. 그러나 DFS에서 스택 오버플로 오류가 발생하지만 다른 사람들은 아무 문제없이 DFS 방문을 실행할 수있었습니다. StackOverFlow 오류가 발생하는 이유는 무엇입니까? 나는 더 많은 메모리를 할당하려고했는데 (16GB RAM을 가졌다.) 그러나 1GB RAM을 사용하고있다.StackOverflowError -java

public void DFSVisit(Graph <String, String> graph, String current, int [] data, StackObject [] finish, boolean complicated){ 
    //data stores the time 
    data[9]++; 
    graph.setAnnotation(current, "time", data[9]); 
    graph.setAnnotation(current, "color", "gray"); 
    Iterator <ArrayList<String>> itr = graph.outAdjacentVertices(current); 
    ArrayList <String> currentlist = null; 
    String adjacent; 
    while(itr.hasNext()){ 
     currentlist = itr.next(); 
     adjacent = currentlist.get(1); 
      if(graph.getAnnotation(adjacent, "color").equals("white")){ 
       graph.setAnnotation(adjacent, "parent", current); 
       DFSVisit(graph, adjacent, data, finish, complicated); 
      } 
    } 
    graph.setAnnotation(current, "color", "black"); 
    data[9]++; 
    graph.setAnnotation(current, "done", data[9]); 
    finish[0].done.push(current); 
    //System.out.println(current); 
} 
+0

검색 공간이 무한하다면 코드를 실행하는 모든 시스템에서이 예외가 발생합니다. – mok

+0

현재 노드를 방문한 것으로 표시해야 인접한 버텍스 목록에서 돌아 가지 않습니다. 두 개의 꼭지점과 그 꼭지점이 결합 된 간단한 그래프를 상상해보십시오. 인접한 두 꼭지점은 서로를 포함 할 것이고 알고리즘은 그것들을 계속해서 반복해서 방문 할 것입니다. – anonymous

답변

0

필자는 내 랩톱에서 작업하도록 전환했으며 즉시 작동했습니다. 분명히 문제는 64 비트 Eclipse 대신 32 비트 Eclipse를 사용하는 것이 었습니다. 나는 내 바탕 화면에서 32 비트를 사용하고 있다는 것을 몰랐다.

1

할당 메모리가 도움이되지 않습니다. 동일한 메서드 내에서 DFSVisit를 호출하고 메서드에 대해 반환 조건을 정의하지 않으므로 stackoverflow 오류가 발생합니다.

0

DFS의 공간 복잡도는 O (bm)입니다. 여기서 m은 검색 공간의 깊이이고 b는 최대 분기 인수입니다. 따라서 m이 무한대이면 문제를 해결할 수 없을 수도 있습니다. 부적절한 구현 문제.

더 좋은 예를 찾으려면 this의 질문을 참조하십시오.

1

일부 조건에서 재귀 호출을 중지해야합니다. 일부 조건에서는 ... 다른 방법으로는 끝없는 호출이되고 스택 오버플로 오류가 발생합니다.