how implement dijkstra s algorithm java
Ovaj vodič objašnjava kako implementirati Dijkstrin algoritam u Javi za pronalaženje najkraćih ruta u grafikonu ili stablu uz pomoć primjera:
U našem ranijem vodiču o Grafovima na Javi vidjeli smo da se grafovi koriste za pronalaženje najkraćeg puta između čvorova, osim ostalih aplikacija.
Da bismo pronašli najkraći put između dva čvora grafa, uglavnom koristimo algoritam poznat kao „ Dijkstrin algoritam '. Ovaj algoritam ostaje široko korišten algoritam za pronalaženje najkraćih ruta u grafu ili stablu.
=> Ovdje provjerite SVE Java tutorijale
Što ćete naučiti:
Dijkstrin algoritam u Javi
S obzirom na ponderirani graf i početni (izvorni) vrh u grafu, Dijkstrin algoritam se koristi za pronalaženje najkraće udaljenosti od izvornog čvora do svih ostalih čvorova u grafu.
Kao rezultat pokretanja Dijkstrinog algoritma na grafu dobivamo stablo najkraće staze (SPT) s izvornim vrhom kao korijenom.
U Dijkstrinom algoritmu održavamo dva skupa ili popisa. Jedan sadrži vrhove koji su dio stabla najkraćeg puta (SPT), a drugi sadrži vrhove koji se procjenjuju da bi bili uključeni u SPT. Stoga za svaku iteraciju nalazimo vrh s drugog popisa koji ima najkraći put.
Pseudokod za Dijkstrin algoritam najkraćeg puta dan je u nastavku.
najbolji besplatni softver za oporavak podataka Windows 10
Pseudokod
Dolje je dan pseudokod za ovaj algoritam.
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
Uzmimo sada grafikon uzorka i ilustrirajmo Dijkstrin algoritam najkraćeg puta .
U početku je SPT (Shortest Path Tree) postavljen na beskonačnost.
Počnimo s vrhom 0. Dakle, za početak stavimo vrh 0 u sptSet.
sptSet = {0, INF, INF, INF, INF, INF}.
Dalje s vrhom 0 u sptSetu istražit ćemo njegove susjede. Vrhovi 1 i 2 dva su susjedna čvora 0 s udaljenostima 2 i 1.
Na gornjoj slici također smo ažurirali svaki susjedni vrh (1 i 2) s pripadajućom udaljenostom od izvornog vrha 0. Sada vidimo da vrh 2 ima minimalnu udaljenost. Pa zatim dodamo vrh 2 u sptSet. Također, istražujemo susjede vrha 2.
Sada tražimo vrh s minimalnom udaljenostom i one koji nisu tamo u spt. Vrh 1 biramo s udaljenošću 2.
Kao što vidimo na gornjoj slici, od svih susjednih čvorova 2, 0 i 1 već su u sptSetu, pa ih ignoriramo. Od susjednih čvorova 5 i 3, 5 imaju najmanje troškova. Stoga ga dodajemo u sptSet i istražujemo susjedne čvorove.
Na gornjoj slici vidimo da su, osim čvorova 3 i 4, svi ostali čvorovi u sptSetu. Od 3 i 4, čvor 3 ima najmanje troškova. Pa smo ga stavili u sptSet.
Kao što je prikazano gore, sada nam je ostao samo jedan vrh, tj. 4, a njegova udaljenost od korijenskog čvora je 16. Napokon, stavljamo ga u sptSet da bismo dobili konačni sptSet = {0, 2, 1, 5, 3, 4} koji daje nam udaljenost svakog vrha od izvornog čvora 0.
Implementacija Dijkstrinog algoritma u Javi
Implementacija Dijkstrinog algoritma najkraćeg puta u Javi može se postići na dva načina. Možemo koristiti redove prioriteta i popis susjedstva ili možemo koristiti matricu i nizove susjedstva.
U ovom ćemo odjeljku vidjeti obje implementacije.
Korištenje reda prioriteta
U ovoj implementaciji koristimo red prioriteta za pohranu vrhova s najkraćom udaljenostom. Grafikon se definira pomoću popisa susjednosti. Primjer programa prikazan je u nastavku.
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 Izlaz:
Korištenje matrice susjedstva
U ovom pristupu koristimo matricu susjedstva za predstavljanje grafa. Za spt set koristimo nizove.
Sljedeći program prikazuje ovu provedbu.
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 Izlaz:
Često postavljana pitanja
P # 1) Radi li Dijkstra za neusmjerene grafikone?
Odgovor: Ako je graf usmjeren ili usmjeren, nije važno u slučaju Dijkstrinog algoritma. Ovaj se algoritam tiče samo vrhova na grafu i težina.
P # 2) Kolika je vremenska složenost Dijkstrinog algoritma?
Odgovor: Složenost vremena Dijkstrinog algoritma je O (V 2). Kada se implementira s redom min-prioriteta, vremenska složenost ovog algoritma svodi se na O (V + E l o g V).
P # 3) Je li Dijkstra pohlepni algoritam?
Odgovor: Da, Dijkstra je pohlepni algoritam. Slično Primovom algoritmu za pronalaženje minimalnog raspona stabla (MST), ovi algoritmi također počinju od korijenskog vrha i uvijek odabiru najoptimalniji vrh s minimalnim putem.
P # 4) Je li Dijkstra DFS ili BFS?
Odgovor: Nije ni jedno ni drugo. No, kako Dijkstrin algoritam koristi prioritetni red za svoju implementaciju, može se smatrati bliskim BFS-u.
P # 5) Gdje se koristi Dijkstra algoritam?
Odgovor: Uglavnom se koristi u protokolima usmjeravanja, jer pomaže pronaći najkraći put od jednog do drugog čvora.
Zaključak
U ovom uputstvu raspravljali smo o Dijkstrinom algoritmu. Ovim algoritmom pronalazimo najkraći put od korijenskog čvora do ostalih čvorova u grafu ili stablu.
Obično implementiramo Dijkstrin algoritam koristeći Prioritetni red jer moramo pronaći minimalni put. Ovaj algoritam također možemo implementirati pomoću matrice susjedstva. U ovom smo tutorijalu raspravljali o oba ova pristupa.
Nadamo se da će vam ovaj vodič biti koristan.
=> Posjetite ovdje da biste vidjeli seriju Java treninga za sve
Preporučena literatura
- Binarni algoritam pretraživanja u Javi - implementacija i primjeri
- Sortiranje mjehurića u Javi - algoritmi za sortiranje Java i primjeri koda
- Sortiranje umetanja u Javi - Algoritam sortiranja umetanja i primjeri
- Sortiranje odabira na Javi - Algoritam sortiranja odabira i primjeri
- Brzo sortiranje u Javi - algoritam, ilustracija i implementacija
- JAVA Tutorial za početnike: 100+ praktičnih Java Video tutorijala
- Java Vodič za refleksiju s primjerima
- Nazubljeni niz u Javi - Vodič s primjerima