2014-02-15 3 views
0

Я ищу эффективный способ нахождения набора всех узлов, доступных из определенной коллекции узлов в JUNG. Я не уверен, как это сделать. Одним из решений было бы получить соседей каждого узла конкретной коллекции и сделать это до тех пор, пока новый узел не добавится к этому процессу. Но я думаю, что, возможно, более эффективный способ будет доступен. Не могли бы вы рассказать мне, что бы это было? (Ниже код моей реализации)Набор достижимых узлов в графе с использованием 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

Прямолинейный подход может быть сделать простой в ширину первого обхода (http://en.wikipedia.org/wiki/Breadth-first_search), но с коллекцией «запуска узлов» вместо одного,:

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

Асимптотически они равны. Например. вставка принимает O (1) в обоих случаях. Манипуляция связью в LinkedHashMap будет * теоретически * включать некоторые накладные расходы, но она должна быть незначительной (и, например, итерация по LinkedHashMap должна быть быстрее, чем итерация по HashMap) – Marco13