2014-04-23 2 views
0

내가 어떤 정점주기의 일부인지 확인하는 방법을 쓰기 위해 노력하고있어,하지만 난StackOverflow의 오류 그래서

java.lang.StackOverflowError 
at java.lang.Integer.compareTo(Unknown Source) 
at java.lang.Integer.compareTo(Unknown Source) 
at java.util.TreeMap.compare(Unknown Source) 
at java.util.TreeMap.put(Unknown Source) 
at java.util.TreeSet.add(Unknown Source) 
at graph.EdgeSet.neighbors(EdgeSet.java:42) 
at graph.Graph.getNeighbors(Graph.java:127) 
at graph.Graph.cycleHelper(Graph.java:164) 
at graph.Graph.cycleHelper(Graph.java:171) 

여기 내 방법입니다이 오류를 얻을

public boolean isInCycle(V vertex) throws IllegalArgumentException { 

    if (!hasVertex(vertex)) { 
     throw new IllegalArgumentException(); 
    } 
    Iterator<Vertex<V>> v = vertexMap.keySet().iterator(); 
    while (v.hasNext()) { 
     Vertex<V> vert = v.next(); 
     vert.activated = false; 
     vert.through = false; 
    } 
    return cycleHelper(vertex); 
} 

private boolean cycleHelper(V vertex) { 
    Vertex<V> ve = vertexMap.get(new Vertex<V>(vertex)).vertex(); 
    ve.activated = true; 
    Iterator<V> n = getNeighbors(vertex).iterator(); 
    while (n.hasNext()) { 
     V vert = n.next(); 
     Vertex<V> curr = vertexMap.get(new Vertex<V>(vert)).vertex(); 
     if (curr.activated) 
      return true; 
     else { 
      return cycleHelper(curr.vertex()); 

      } 
    } 

    return false; 
} 

아무도 올바른 방향으로 나를 가리킬 수 있습니까?

답변

0

EDITED : 내 첫 번째 대답은 무한 재귀를 나타 냈지만 여기서는 그렇지 않습니다. activated 플래그는 이미이를 방지하는 것을 목표로합니다.

StackOverflowError에는 두 가지 주된 이유가있을 수 있습니다. 첫 번째는 무한 재귀입니다 (이미 배제되어 있음). 두 번째는 호출 스택에 너무 많은 호출이 있다는 것입니다. 이것은 예를 들어 알고리즘이 첫 번째 사이클을 만나기 전에 너무 많은 정점을 지나쳐야하는 경우에 발생할 수 있습니다. 여기서 "너무 많음"은 "수천"을 의미 할 수 있으며 최대 스택 크기 및 각 스택에 필요한 메모리 양에 따라 다릅니다.

에서 으로 변환하는 것이 좋습니다. 이것은 폭 - 또는 깊이 우선 검색 일 수 있습니다.

나는 여기를 implemement하려고했으나 구조 ( V, Vertex<V>의 역할을 참조하여 vertexMap 등)은 매우 혼란, 그래서 나는이 올바른지 완전히 확실하지 않다 :

public boolean isInCycle(V vertex) throws IllegalArgumentException 
{ 
    if (!hasVertex(vertex)) 
    { 
     throw new IllegalArgumentException(); 
    } 
    Iterator<Vertex<V>> v = vertexMap.keySet().iterator(); 
    while (v.hasNext()) 
    { 
     Vertex<V> vert = v.next(); 
     vert.activated = false; 
     vert.through = false; 
    } 

    Deque<V> queue = new LinkedList<V>(); 
    queue.add(vertex); 
    vertexMap.get(new Vertex<V>(vertex)).vertex().activated = true; 
    while (!queue.isEmpty()) 
    { 
     V current = queue.removeFirst(); 
     Iterator<V> neighbors = getNeighbors(current).iterator(); 
     while (neighbors.hasNext()) 
     { 
      V neighbor = neighbors.next(); 
      Vertex<V> n = vertexMap.get(new Vertex<V>(neighbor)).vertex(); 
      if (n.activated) 
      { 
       return true; 
      } 
      else 
      { 
       queue.add(neighbor); 
       n.activated = true; 
      } 
     } 
    } 
    return false; 
} 
+0

내가 부울을 활성화했습니다 – Mark

+0

이미 활성화되었는지 확인하지 않습니까? 버텍스 클래스는 부울 값을 가지고 있습니다. – Mark

+0

@Dad 죄송합니다, 그것을 잘못 해석하셨습니다. 나는 대답을 편집 할 것이지만, 새로운 것은 추측 일 뿐이다. (그리고 여전히 틀린 것이 있다면 나는 대답을 지울 것이다) – Marco13

관련 문제