how implement dijkstra s algorithm java
Ce didacticiel explique comment implémenter l'algorithme de Dijkstra en Java pour trouver les itinéraires les plus courts dans un graphique ou une arborescence à l'aide d'exemples:
Dans notre précédent tutoriel sur les graphiques en Java, nous avons vu que les graphiques sont utilisés pour trouver le chemin le plus court entre les nœuds en dehors des autres applications.
Pour trouver le chemin le plus court entre deux nœuds d'un graphe, nous utilisons principalement un algorithme appelé ' Algorithme de Dijkstra ». Cet algorithme reste l'algorithme largement utilisé pour trouver les itinéraires les plus courts dans un graphe ou un arbre.
=> Consultez TOUS les didacticiels Java ici
Ce que vous apprendrez:
Algorithme de Dijkstra en Java
Étant donné un graphique pondéré et un sommet de départ (source) dans le graphique, l’algorithme de Dijkstra est utilisé pour trouver la distance la plus courte entre le nœud source et tous les autres nœuds du graphique.
Suite à l’exécution de l’algorithme de Dijkstra sur un graphe, nous obtenons l’arbre de chemin le plus court (SPT) avec le sommet source comme racine.
Dans l’algorithme de Dijkstra, nous maintenons deux ensembles ou listes. L'un contient les sommets qui font partie de l'arbre du chemin le plus court (SPT) et l'autre contient les sommets qui sont évalués pour être inclus dans SPT. Par conséquent, pour chaque itération, nous trouvons un sommet de la deuxième liste qui a le chemin le plus court.
Le pseudocode de l’algorithme de chemin le plus court de Dijkstra est donné ci-dessous.
où regarder des animes en ligne gratuitement
Pseudocode
Vous trouverez ci-dessous le pseudocode de cet algorithme.
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
Prenons maintenant un exemple de graphique et illustrons l’algorithme de chemin le plus court de Dijkstra .
Initialement, l'ensemble SPT (Shortest Path Tree) est réglé sur l'infini.
Commençons par le sommet 0. Donc, pour commencer, nous mettons le sommet 0 dans sptSet.
sptSet = {0, INF, INF, INF, INF, INF}.
Ensuite, avec le sommet 0 dans sptSet, nous explorerons ses voisins. Les sommets 1 et 2 sont deux nœuds adjacents de 0 avec une distance de 2 et 1 respectivement.
Dans la figure ci-dessus, nous avons également mis à jour chaque sommet adjacent (1 et 2) avec leur distance respective du sommet source 0. Nous voyons maintenant que le sommet 2 a une distance minimale. Ensuite, nous ajoutons le sommet 2 au sptSet. Nous explorons également les voisins du sommet 2.
Maintenant, nous cherchons le sommet avec une distance minimale et ceux qui ne sont pas là dans spt. Nous choisissons le sommet 1 avec la distance 2.
Comme nous le voyons dans la figure ci-dessus, parmi tous les nœuds adjacents de 2, 0 et 1 sont déjà dans sptSet, nous les ignorons donc. Parmi les nœuds adjacents 5 et 3, 5 ont le moindre coût. Nous l'ajoutons donc au sptSet et explorons ses nœuds adjacents.
Dans la figure ci-dessus, nous voyons qu'à l'exception des nœuds 3 et 4, tous les autres nœuds sont dans sptSet. Sur 3 et 4, le nœud 3 a le moindre coût. Nous l'avons donc mis dans sptSet.
Comme indiqué ci-dessus, nous n'avons plus qu'un seul sommet à gauche, c'est-à-dire 4 et sa distance du nœud racine est 16. Enfin, nous le mettons dans sptSet pour obtenir le sptSet final = {0, 2, 1, 5, 3, 4} qui nous donne la distance de chaque sommet du nœud source 0.
Implémentation de l'algorithme de Dijkstra en Java
L’implémentation de l’algorithme de chemin le plus court de Dijkstra en Java peut être réalisée de deux manières. Nous pouvons soit utiliser des files d'attente prioritaires et une liste de contiguïté, soit utiliser une matrice et des tableaux de contiguïté.
Dans cette section, nous verrons les deux implémentations.
Utilisation d'une file d'attente prioritaire
Dans cette implémentation, nous utilisons la file d'attente prioritaire pour stocker les sommets avec la distance la plus courte. Le graphe est défini à l'aide de la liste de contiguïté. Un exemple de programme est présenté ci-dessous.
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 Production:

Utilisation de la matrice d'adjacence
Dans cette approche, nous utilisons la matrice de contiguïté pour représenter le graphe. Pour l'ensemble spt, nous utilisons des tableaux.
Le programme suivant montre cette implémentation.
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 Production:

Questions fréquemment posées
Q # 1) Dijkstra fonctionne-t-il pour les graphes non dirigés?
Répondre: Si le graphe est dirigé ou non n’a pas d’importance dans le cas de l’algorithme de Dijkstra. Cet algorithme ne concerne que les sommets du graphe et les poids.
Q # 2) Quelle est la complexité temporelle de l'algorithme de Dijkstra?
Répondre: La complexité temporelle de l'algorithme de Dijkstra est O (V 2). Lorsqu'il est mis en œuvre avec la file d'attente à priorité min, la complexité temporelle de cet algorithme se résume à O (V + E l o g V).
Q # 3) Dijkstra est-il un algorithme glouton?
Répondre: Oui, Dijkstra est un algorithme gourmand. Semblables à l'algorithme de Prim de recherche de l'arbre couvrant minimum (MST), ces algorithmes partent également d'un sommet racine et choisissent toujours le sommet le plus optimal avec le chemin minimum.
Q # 4) Dijkstra est-il DFS ou BFS?
Répondre: Ce n'est ni l'un ni l'autre. Mais comme l'algorithme de Dijkstra utilise une file d'attente prioritaire pour son implémentation, il peut être considéré comme proche de BFS.
Q # 5) Où est utilisé l'algorithme de Dijkstra?
Répondre: Il est principalement utilisé dans les protocoles de routage car il permet de trouver le chemin le plus court d'un nœud à un autre nœud.
Conclusion
Dans ce didacticiel, nous avons abordé l’algorithme de Dijkstra. Nous utilisons cet algorithme pour trouver le chemin le plus court entre le nœud racine et les autres nœuds du graphe ou d'un arbre.
Nous implémentons généralement l'algorithme de Dijkstra en utilisant une file d'attente prioritaire car nous devons trouver le chemin minimum. Nous pouvons également implémenter cet algorithme en utilisant la matrice de contiguïté. Nous avons discuté de ces deux approches dans ce didacticiel.
Nous espérons que vous trouverez ce tutoriel utile.
=> Visitez ici pour voir la série de formations Java pour tous
lecture recommandée
- Algorithme de recherche binaire en Java - Implémentation et exemples
- Tri à bulles en Java - Algorithmes de tri Java et exemples de code
- Tri par insertion en Java - Algorithme de tri par insertion et exemples
- Tri par sélection en Java - Algorithme de tri par sélection et exemples
- QuickSort en Java - Algorithme, illustration et implémentation
- Tutoriel JAVA pour les débutants: plus de 100 tutoriels vidéo Java pratiques
- Tutoriel de réflexion Java avec des exemples
- Jagged Array In Java - Tutoriel avec des exemples