2016-04-30 5 views
6

Ich versuche, wenn dieser Algorithmus A * ist, um herauszufinden, (A-Star) Algorithmus oder was auch immer, aber ich bin immer noch verwirrt.Welche Art von Labyrinth Solving-Algorithmus ist das?

Stack<Cell> stack = new Stack<>(); 

stack.push(maze.start()); 
stack.peek().mark(SOLUTION_MARK); 

while (!stack.peek().hasMark(Cell.END)) { 

    Cell current = stack.peek(); 
    ArrayList<Cell> dirs = current.neighbors(); 

    boolean found = false; 
    for (Cell next : dirs) { 
     if (next.hasMark(ERROR_MARK) || next.hasMark(SOLUTION_MARK)) { 
      continue; 
     } 
     stack.push(next); 
     next.mark(SOLUTION_MARK); 
     found = true; 
     break; 
    } 
    if (!found) { 
     stack.pop().mark(ERROR_MARK); 
    } 
    for (MazeBody listener : listeners) { 
     listener.repaint(); 
    } 
} 

Mark.java

public final class Mark { 

    private static Map<String, Mark> TABLE = new HashMap<>(); 

    private String name; 

    private Mark(String markName) { 
     name = markName; 
    } 

    public static Mark get(String name) { 
     Mark mark = TABLE.get(name); 
     if (mark == null) { 
      mark = new Mark(name); 
      TABLE.put(name, mark); 
     } 
     return mark; 
    } 
} 
+1

ist Ihr Code nicht vollständig; siehe http://stackoverflow.com/help/mcve. Fügen Sie auch das relevante Sprachtag hinzu (ich weiß, dass es Java ist, aber ich sollte nicht raten müssen). – Jubobs

+0

Können Sie die Definition für Marke angeben? Das sieht für mich wie eine einfache Tiefensuche aus, aber mit globaler Markierung von besucht. –

+0

@LucasMoeskops: Nein, es markiert die bereits besuchten Orte. Also wird es höchstens mit n Anzahl der Zellen in O (n^2) laufen. –

Antwort

3

Nach dem, was Sie zeigen, ich würde sagen, es Tiefensuche ist, aber mit einem Scheck, ob der Ort bereits für den Besuch geplant. Da es einen Stapel verwendet, wird es immer zuerst die Orte tiefer im Suchbaum besuchen. Aber von dem Moment es ein Ort, an dem Stapel hinzufügt, den Platz als Lösung Zeichen markiert es zu verhindern, dass neubewerteter wenn ein anderer Weg den gleichen Platz erreichen würde.

ist jedoch zu beachten, dass es jede Fliese ein SOLUTION_MARK markieren wird, wenn es nicht mit Knoten anderen kommen kann, als mit einem SOLUTION_MARK markiert oder einem ERROR_MARK. Es markiert somit mehr Fliesen als die Fliesen, die zur (kürzesten) Lösung beitragen. In diesem Sinne ist es nicht wirklich ein Labyrinth Lösungsalgorithmus: es einfach markiert Fliesen als SOLUTION_MARK, wenn mindestens eine andere Fliese noch nicht geplant ist, dass zu einer Lösung beitragen kann. Der Algorithmus wird beendet, wenn alle erreichbaren Kacheln markiert wurden.

+0

Also ist die Komplexität "O (n^2)", wobei "n" die Gesamtzahl der "besuchten Zellen" ist, unabhängig davon, ob sie als "Fehler" oder "Lösung" markiert sind, richtig? –

+0

@AbdelrahmanWahdan: wenn jeder Nachbar * n * Zellen haben kann ja. Nehmen wir an, Sie können sich nur in Richtung "4" bewegen, die Komplexität der Zeit ist O (n). –

4

Dies ist Tiefe erste Suche geschrieben iterativ anstatt rekursiv.

rekursive DFS (Preorder) Pseudo-Code wie folgt aussieht:

visit (current node) 
for each child node of current node 
    if node is not explored 
     dfs (node) 

Iterative Version von DFS wie folgt aussieht:

Put current node on stack 
In a while loop pop the stack if not empty 
    visit (popped node) 
    push all Unvisited and NotVisiting neighbors of popped node on the stack 
End while 

Unvisited und NotVisiting in der Iterative Version bedeutet, dass der Knoten weder besucht vorher, noch ist es im Stapel für den Besuch.


Die Zeitkomplexität dieses Algorithmus hängt davon ab, ob der Graph hat als Adjazenzliste oder Adjazenzmatrix gespeichert. Für die Liste wäre es O (n). Für Matrix, würde es werden O (n), denn auch wenn Sie nur einmal pro Knoten erkunden, müssen Sie jede Zeile und Spalte der Matrix besuchen zu wissen, ob es einen Weg zwischen einem Knoten X und dem Knoten Y. ist

Die Raumkomplexität dieses Algorithmus kann zum schlechtesten von O (n) gehen, wenn der Graph jeden Knoten mit nur einem Nachbarn hätte, der wie eine einfach verknüpfte Liste wird.

+0

Ich denke, es ist erwähnenswert, dass es eine Ereignisprüfung durchführt: Überprüfen Sie, ob der Knoten bereits zum Stack hinzugefügt wurde. –

+0

@WillemVanOnsem: Aktualisiert. – displayName