2014-02-15 11 views
0

JUNG의 특정 노드 컬렉션에서 도달 할 수있는 모든 노드 집합을 찾는 효율적인 방법을 찾고 있습니다. 어떻게해야할지 모르겠다. 한 가지 해결책은 특정 컬렉션의 각 노드의 이웃을 가져 와서이 프로세스와 관련하여 새 노드를 추가하지 않을 때까지 수행하는 것입니다. 하지만 아마 더 효율적인 방법이있을 것이라고 생각합니다. 그게 뭔지 말해 줄래? 직접적인 접근 방식은 간단한 너비 우선 탐색 (http://en.wikipedia.org/wiki/Breadth-first_search를) 할 수JUNG을 사용하여 그래프로 도달 가능한 노드 집합

private HashSet<Customer> getReachableNodes(Collection<Customer> churners, DirectedSparseGraph<Customer, Transaction> net) { 

     HashSet<Customer> reachableNode = new HashSet<Customer>(); 
     for (Customer churner : churners) { 
      for(Customer neighbor:net.getVertices()){ 
       if(isNeighbor(neighbor,churners,net)) reachableNode.add(neighbor) 
      } 
     } 
     return reachableNode ; 
    } 

답변

1

(아래에있는 내 구현의 코드), 그러나의 컬렉션 대신 하나 하나 "노드 시작"

private static <V> Set<V> findReachable(
    Collection<? extends V> startNodes, Graph<V, ?> graph) 
{ 
    Queue<V> queue = new LinkedList<V>(); 
    Set<V> visited = new LinkedHashSet<V>(); 
    queue.addAll(startNodes); 
    visited.addAll(startNodes); 
    while(!queue.isEmpty()) 
    { 
     V v = queue.poll(); 
     Collection<V> neighbors = graph.getNeighbors(v); 
     for (V n : neighbors) 
     { 
      if (!visited.contains(n)) 
      { 
       queue.offer(n); 
       visited.add(n); 
      } 
     } 
    } 
    return visited; 
} 
+0

성능 측면에서 어느 것이 더 낫습니까? LinkedHashSet 또는 일반 hashSet을 사용합니까? –

+0

Asymptotically, 그들은 동일합니다. 예 : 삽입은 두 경우 모두 O (1)을 필요로합니다. LinkedHashMap에서 링키지를 유지 보수하는 것은 이론적으로 오버 헤드가 일부 포함되지만 무시할 수 있어야합니다 (예를 들어, LinkedHashMap을 반복하는 것은 HashMap을 반복하는 것보다 빠름) – Marco13