2016-07-30 25 views
0

Der Versuch, bidirektionale Suche nach Grafik zu implementieren, aber viele Male fehlgeschlagen, es zu tun. Wie ich verstehe, sollte ich 2 Breadth First Searches für "Start" und "End" Vertexes irgendwie zusammenführen. Der Basisfall liegt vor, wenn beide Suchvorgänge denselben Vertex gefunden haben. Können Sie mir ein Codebeispiel (in Java oder JavaScript, wenn möglich) zur Verfügung stellen oder mit Code für die bidirektionale Suche verknüpfen?Bidirektionale Suche Implementierung für Grafik

+0

für Off-Site-Ressourcen Erkundigung off-topic ist. Wie wäre es, wenn du ein [mcve] des Problems zeigst, das du mit dem Code hast, den du hast? –

+0

# cricket_007 Ich weiß nicht, wie man Code wie folgt zu schreiben beginnt. Ich habe bereits 8 Tage damit verbracht, es zu versuchen. Ich habe keinen Code, weil ich nicht weiß, wie ich anfangen soll, diesen Code zu schreiben. Und deshalb habe ich kein Codebeispiel. Das tut mir leid. Ich brauche Hinweise. –

+0

Ich verstehe nicht, was eine bidirektionale Suche ist. Was ist los mit einer regelmäßigen Suche nach Tiefe oder Breite? –

Antwort

5

Angenommen, Sie Knoten wie dieses:

public static class Node { 
    private final T data; 
    private final Set<Node> adjacent = new HashSet<Node>(); 

    public Set<Node> getAdjacent() { 
     return adjacent; 
    } 

    public Node(T data) { 
     this.data = data; 
    } 

    public T getData() { 
     return data; 
    } 

    // returns if the node was added, false if already there 
    public boolean addAdjacent(Node node) { 
     return adjacent.add(node); 
    } 

    // returns true if any were added 
    public boolean addAdjacents(Set<Node> nodes) { 
     return adjacent.addAll(nodes); 
    } 
} 

Dann denke ich, Sie nach so etwas wie dieses sind:

public static boolean pathExistsBidirectional(Node a, Node b) { 
    // BFS on both nodes at the same time 
    Queue<Node> queueA = new Queue<Node>(); 
    Queue<Node> queueB = new Queue<Node>(); 
    Set<Node> visitedA = new HashSet<Node>(); 
    Set<Node> visitedB = new HashSet<Node>(); 

    visitedA.add(a); 
    visitedB.add(b); 
    queueA.add(a); 
    queueB.add(b); 

    while (!queueA.isEmpty() && !queueB.isEmpty()) { 
     if (pathExistsBidirectionalHelper(queueA, visitedA, visitedB)) { 
     return true; 
     } 
     if (pathExistsBidirectionalHelper(queueB, visitedB, visitedA)) { 
     return true; 
     } 
    } 

    return false; 
    } 

    private static boolean pathExistsBidirectionalHelper(Queue<Node> queue, Set<Node> visitedFromThisSide, Set<Node> visitedFromThatSide) { 
    if (!queue.isEmpty()) { 
     Node next = queue.remove(); 
     for (Node adjacent : next.getAdjacent()) { 
     if (visitedFromThatSide.contains(adjacent)) { 
      return true; 
     } else if (visitedFromThisSide.add(adjacent)) { 
      queue.add(adjacent); 
     } 
     } 
    } 
    return false; 
    } 
+0

Ich habe dieses mit getestet Knoten node1 = neuer Knoten ("jan"); Knoten node2 = neuer Knoten ("karol"); Knoten node3 = neuer Knoten ("lukasz"); node1.addAngrenzend (node2); node2.addAngrenzend (node3); System.out.println (PfadExistsBidirektional (Knoten1, Knoten3)); und es funktioniert nicht, druckt falsch ... oder mache ich vielleicht etw falsch? – hanskoff