how implement dijkstra s algorithm java
Ta vadnica pojasnjuje, kako v Java implementirati Dijkstrin algoritem za iskanje najkrajših poti v grafu ali drevesu s pomočjo primerov:
V naši prejšnji vadnici o Grafih v Javi smo videli, da se grafi uporabljajo za iskanje najkrajše poti med vozlišči, razen drugih aplikacij.
Da najdemo najkrajšo pot med dvema vozliščema grafa, večinoma uporabljamo algoritem, znan kot ' Dijkstrin algoritem '. Ta algoritem ostaja pogosto uporabljen algoritem za iskanje najkrajših poti v grafu ali drevesu.
=> Tukaj preverite VSE vadnice Java
Kaj se boste naučili:
Dijkstrin algoritem v Javi
Glede na tehtani graf in izhodiščno (izvorno) oglišče v grafu se Dijkstrin algoritem uporablja za iskanje najkrajše razdalje od izvornega vozlišča do vseh ostalih vozlišč v grafu.
Kot rezultat izvajanja Dijkstrinega algoritma na grafu dobimo drevo najkrajše poti (SPT) z izvorno točko kot korenom.
V algoritmu Dijkstra vzdržujemo dva niza ali sezname. Ena vsebuje oglišča, ki so del drevesa najkrajše poti (SPT), druga pa oglišča, za katera se ocenjuje, da so vključena v SPT. Zato za vsako ponovitev najdemo točko z drugega seznama, ki ima najkrajšo pot.
Psevkodo za algoritem najkrajše poti Dijkstra je podan spodaj.
kateri je najboljši prenosnik glasbe za android
Psevkodo
Spodaj je psevdokoda za ta algoritem.
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
Vzemimo zdaj vzorčni graf in ponazorimo algoritem najkrajše poti Dijkstra .
Sprva je nabor SPT (Shortest Path Tree) nastavljen na neskončnost.
Začnimo z ogliščem 0. Torej za začetek postavimo oglišče 0 v sptSet.
sptSet = {0, INF, INF, INF, INF, INF}.
Nato bomo z vertex 0 v sptSet raziskovali njene sosede. Točki 1 in 2 sta dve sosednji vozlišči 0 z razdaljo 2 oziroma 1.
Na zgornji sliki smo posodobili tudi vsako sosednjo točko (1 in 2) z vsako oddaljenostjo od izvorne točke 0. Zdaj vidimo, da ima točka 2 najmanjšo razdaljo. Nato v sptSet dodamo točko 2. Raziskujemo tudi sosede točke 2.
Zdaj iščemo oglišče z minimalno razdaljo in tiste, ki jih v spt ni. Točko 1 izberemo z razdaljo 2.
Kot vidimo na zgornji sliki, so od vseh sosednjih vozlišč 2, 0 in 1 že v sptSet, zato jih ignoriramo. 5 od sosednjih vozlišč 5 in 3 ima 5 najmanj stroškov. Torej ga dodamo v sptSet in raziščemo sosednja vozlišča.
Na zgornji sliki vidimo, da so razen vozlišč 3 in 4 vsa druga vozlišča v sptSet. Od 3 in 4 ima vozlišče 3 najmanjše stroške. Torej smo ga postavili v sptSet.
Kot je prikazano zgoraj, imamo zdaj le še eno oglišče, tj. 4 in njegova razdalja od korenskega vozlišča je 16. Končno ga damo v sptSet, da dobimo končni sptSet = {0, 2, 1, 5, 3, 4}, ki nam daje razdaljo vsake točke od izvornega vozlišča 0.
Implementacija Dijkstrinega algoritma v Javi
Izvedbo Dijkstrinega algoritma najkrajše poti v Javi je mogoče doseči na dva načina. Lahko uporabimo prednostne čakalne vrste in seznam sosednosti ali pa matriko in nize sosednosti.
V tem poglavju bomo videli obe izvedbi.
Uporaba prednostne čakalne vrste
Pri tej izvedbi uporabljamo prednostno vrsto, da shranimo oglišča z najkrajšo razdaljo. Graf je definiran s pomočjo seznama sosednosti. Vzorčni program je prikazan spodaj.
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 Izhod:
Uporaba matrice sosedstva
Pri tem pristopu za predstavitev grafa uporabljamo matrico sosednosti. Za spt set uporabljamo polja.
Naslednji program prikazuje to izvedbo.
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 Izhod:
Pogosto zastavljena vprašanja
V # 1) Ali Dijkstra deluje za neusmerjene grafe?
Odgovor: Če je graf usmerjen ali neusmerjen, v primeru Dijkstrinega algoritma ni pomembno. Ta algoritem se ukvarja samo z oglišči na grafu in utežmi.
V # 2) Kakšna je časovna zapletenost Dijkstrinega algoritma?
Odgovor: Časovna kompleksnost Dijkstrinega algoritma je O (V 2). Ko je implementiran s čakalno vrsto s prioriteto min, se časovna zapletenost tega algoritma zmanjša na O (V + E l o g V).
V # 3) Je Dijkstra požrešen algoritem?
Odgovor: Da, Dijkstra je pohlepen algoritem. Podobno kot Primov algoritem za iskanje minimalnega drevesa (MST) se tudi ti algoritmi začnejo iz korenske točke in vedno izberejo najbolj optimalno točko z minimalno potjo.
V # 4) Ali je Dijkstra DFS ali BFS?
Odgovor: Niti eno niti drugo. Ker pa Dijkstrin algoritem uporablja prednostno čakalno vrsto za njegovo izvajanje, ga lahko obravnavamo kot blizu BFS.
V # 5) Kje se uporablja algoritem Dijkstra?
Odgovor: Uporablja se večinoma v usmerjevalnih protokolih, saj pomaga najti najkrajšo pot od enega do drugega vozlišča.
Zaključek
V tej vadnici smo razpravljali o algoritmu Dijkstra. Ta algoritem uporabljamo za iskanje najkrajše poti od korenskega vozlišča do drugih vozlišč v grafu ali drevesu.
Običajno Dijkstrin algoritem implementiramo s prednostno čakalno vrsto, saj moramo najti minimalno pot. Ta algoritem lahko implementiramo tudi z uporabo matrice sosednosti. O obeh pristopih smo razpravljali v tej vadnici.
Upamo, da vam bo ta vadnica v pomoč.
=> Obiščite tukaj, da si ogledate serijo Java Training For All
Priporočeno branje
- Binarni algoritem iskanja v Javi - implementacija in primeri
- Razvrstitev mehurčkov v Javi - algoritmi za razvrščanje Java in primeri kode
- Razvrstitev vstavitve v Javi - Algoritem razvrščanja vstavkov in primeri
- Razvrščanje razvrščanja v Javi - Algoritem razvrščanja izbir in primeri
- Hitro razvrščanje v Javi - algoritem, ilustracija in izvedba
- JAVA Vadnica za začetnike: 100+ praktičnih Javnih video vadnic
- Vadnica za refleksijo Java s primeri
- Nazobčan niz v Javi - Vadnica s primeri