2014-02-15 47 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