how implement dijkstra s algorithm java
In diesem Tutorial wird anhand von Beispielen erläutert, wie Sie den Dijkstra-Algorithmus in Java implementieren, um die kürzesten Routen in einem Diagramm oder einem Baum zu finden:
In unserem früheren Tutorial zu Diagrammen in Java haben wir gesehen, dass Diagramme verwendet werden, um den kürzesten Pfad zwischen den Knoten neben anderen Anwendungen zu finden.
Um den kürzesten Weg zwischen zwei Knoten eines Graphen zu finden, verwenden wir meistens einen Algorithmus, der als „ Dijkstra-Algorithmus ”. Dieser Algorithmus bleibt der weit verbreitete Algorithmus, um die kürzesten Routen in einem Diagramm oder einem Baum zu finden.
=> Überprüfen Sie ALLE Java-Tutorials hier
Was du lernen wirst:
Dijkstras Algorithmus in Java
Bei einem gewichteten Diagramm und einem Start- (Quell-) Scheitelpunkt im Diagramm wird der Dijkstra-Algorithmus verwendet, um den kürzesten Abstand vom Quellknoten zu allen anderen Knoten im Diagramm zu ermitteln.
Als Ergebnis des ausgeführten Dijkstra-Algorithmus in einem Diagramm erhalten wir den kürzesten Pfadbaum (SPT) mit dem Quellscheitelpunkt als Wurzel.
Im Dijkstra-Algorithmus pflegen wir zwei Sätze oder Listen. Einer enthält die Scheitelpunkte, die Teil des SPT (Shortest Path Tree) sind, und der andere enthält Scheitelpunkte, die ausgewertet werden, um in SPT aufgenommen zu werden. Daher finden wir für jede Iteration einen Scheitelpunkt aus der zweiten Liste mit dem kürzesten Pfad.
Der Pseudocode für den Dijkstra-Algorithmus für den kürzesten Pfad ist unten angegeben.
wie man kostenlos Quickbooks bekommt
Pseudocode
Unten ist der Pseudocode für diesen Algorithmus angegeben.
procedure dijkstra(G, S) G-> graph; S->starting vertex begin for each vertex V in G //initialization; initial path set to infinite path(V) <- infinite previous(V) <- NULL If V != S, add V to Priority Queue PQueue path (S) <- 0 while PQueue IS NOT EMPTY U <- Extract MIN from PQueue for each unvisited adjacent_node V of U tempDistance <- path (U) + edge_weight(U, V) if tempDistance < path (V) path (V) <- tempDistance previous(V) <- U return path(), previous() end
Nehmen wir nun ein Beispieldiagramm und veranschaulichen den Algorithmus für den kürzesten Pfad der Dijkstra .
Zu Beginn ist der SPT-Satz (Shortest Path Tree) auf unendlich eingestellt.
Beginnen wir mit Scheitelpunkt 0. Zunächst setzen wir den Scheitelpunkt 0 in sptSet.
sptSet = {0, INF, INF, INF, INF, INF}.
Als nächstes werden wir mit Vertex 0 in sptSet die Nachbarn untersuchen. Die Eckpunkte 1 und 2 sind zwei benachbarte Knoten von 0 mit dem Abstand 2 bzw. 1.
In der obigen Abbildung haben wir auch jeden benachbarten Scheitelpunkt (1 und 2) mit seinem jeweiligen Abstand vom Quellscheitelpunkt 0 aktualisiert. Nun sehen wir, dass der Scheitelpunkt 2 einen Mindestabstand hat. Als nächstes fügen wir dem sptSet Vertex 2 hinzu. Außerdem erkunden wir die Nachbarn von Vertex 2.
Nun suchen wir nach dem Scheitelpunkt mit minimalem Abstand und denjenigen, die in spt nicht vorhanden sind. Wir wählen Scheitelpunkt 1 mit Abstand 2.
Wie wir in der obigen Abbildung sehen, befinden sich von allen benachbarten Knoten 2, 0 und 1 bereits in sptSet, sodass wir sie ignorieren. Von den benachbarten Knoten 5 und 3 haben 5 die geringsten Kosten. Also fügen wir es dem sptSet hinzu und untersuchen die benachbarten Knoten.
In der obigen Abbildung sehen wir, dass sich mit Ausnahme der Knoten 3 und 4 alle anderen Knoten in sptSet befinden. Von 3 und 4 hat Knoten 3 die geringsten Kosten. Also haben wir es in sptSet eingefügt.
Wie oben gezeigt, haben wir jetzt nur noch einen Scheitelpunkt, dh 4, und sein Abstand vom Wurzelknoten beträgt 16. Schließlich setzen wir ihn in sptSet, um das endgültige sptSet = {0, 2, 1, 5, 3, 4} zu erhalten gibt uns den Abstand jedes Scheitelpunkts vom Quellknoten 0 an.
Implementierung des Dijkstra-Algorithmus in Java
Die Implementierung des Dijkstra-Algorithmus für kürzeste Wege in Java kann auf zwei Arten erfolgen. Wir können entweder Prioritätswarteschlangen und Adjazenzlisten verwenden oder Adjazenzmatrix und Arrays verwenden.
In diesem Abschnitt sehen wir beide Implementierungen.
Verwenden einer Prioritätswarteschlange
In dieser Implementierung verwenden wir die Prioritätswarteschlange, um die Scheitelpunkte mit dem kürzesten Abstand zu speichern. Das Diagramm wird anhand der Adjazenzliste definiert. Ein Beispielprogramm ist unten gezeigt.
import java.util.*; class Graph_pq { int dist(); Set visited; PriorityQueue pqueue; int V; // Number of vertices List adj_list; //class constructor public Graph_pq(int V) { this.V = V; dist = new int(V); visited = new HashSet(); pqueue = new PriorityQueue(V, new Node()); } // Dijkstra's Algorithm implementation public void algo_dijkstra(List adj_list, int src_vertex) { this.adj_list = adj_list; for (int i = 0; i adj_list = new ArrayList(); // Initialize adjacency list for every node in the graph for (int i = 0; i Ausgabe:
Verwenden der Adjazenzmatrix
Bei diesem Ansatz verwenden wir die Adjazenzmatrix, um den Graphen darzustellen. Für spt set verwenden wir Arrays.
Das folgende Programm zeigt diese Implementierung.
import java.util.*; import java.lang.*; import java.io.*; class Graph_Shortest_Path { static final int num_Vertices = 6; //max number of vertices in graph // find a vertex with minimum distance int minDistance(int path_array(), Boolean sptSet()) { // Initialize min value int min = Integer.MAX_VALUE, min_index = -1; for (int v = 0; v Ausgabe:
Häufig gestellte Fragen
F # 1) Funktioniert Dijkstra für ungerichtete Diagramme?
Antworten: Ob der Graph gerichtet oder ungerichtet ist, spielt beim Dijkstra-Algorithmus keine Rolle. Dieser Algorithmus befasst sich nur mit den Eckpunkten im Diagramm und den Gewichten.
F # 2) Wie zeitlich komplex ist der Dijkstra-Algorithmus?
Antworten: Die zeitliche Komplexität des Dijkstra-Algorithmus ist O (V 2). Bei Implementierung mit der Warteschlange mit minimaler Priorität beträgt die zeitliche Komplexität dieses Algorithmus O (V + E l o g V).
F # 3) Ist Dijkstra ein gieriger Algorithmus?
Antworten: Ja, Dijkstra ist ein gieriger Algorithmus. Ähnlich wie bei Prims Algorithmus zum Ermitteln des minimalen Spanning Tree (MST) beginnen diese Algorithmen auch bei einem Wurzelscheitelpunkt und wählen immer den optimalsten Scheitelpunkt mit dem minimalen Pfad.
F # 4) Ist Dijkstra DFS oder BFS?
Antworten: Es ist weder. Da der Dijkstra-Algorithmus für seine Implementierung eine Prioritätswarteschlange verwendet, kann er als nahe an BFS angesehen werden.
F # 5) Wo wird der Dijkstra-Algorithmus verwendet?
Antworten: Es wird hauptsächlich in Routing-Protokollen verwendet, um den kürzesten Weg von einem Knoten zu einem anderen Knoten zu finden.
Fazit
In diesem Tutorial haben wir den Dijkstra-Algorithmus besprochen. Wir verwenden diesen Algorithmus, um den kürzesten Weg vom Wurzelknoten zu den anderen Knoten im Diagramm oder in einem Baum zu finden.
Normalerweise implementieren wir den Dijkstra-Algorithmus mithilfe einer Prioritätswarteschlange, da wir den minimalen Pfad finden müssen. Wir können diesen Algorithmus auch mithilfe der Adjazenzmatrix implementieren. Wir haben beide Ansätze in diesem Tutorial besprochen.
Wir hoffen, dass Sie dieses Tutorial hilfreich finden.
=> Besuchen Sie hier, um die Java-Schulungsreihe für alle zu sehen
Literatur-Empfehlungen
- Binärer Suchalgorithmus in Java - Implementierung und Beispiele
- Blasensortierung in Java - Java-Sortieralgorithmen und Codebeispiele
- Einfügungssortierung in Java - Einfügungssortierungsalgorithmus und Beispiele
- Auswahlsortierung in Java - Auswahlsortierungsalgorithmus und Beispiele
- QuickSort In Java - Algorithmus, Illustration & Implementierung
- JAVA-Tutorial für Anfänger: Über 100 praktische Java-Video-Tutorials
- Java Reflection Tutorial mit Beispielen
- Jagged Array In Java - Tutorial mit Beispielen