how implement dijkstra s algorithm java
Tento výukový program vysvětluje, jak implementovat Dijkstrův algoritmus v Javě k vyhledání nejkratších cest v grafu nebo stromu pomocí příkladů:
V našem dřívějším výukovém programu Grafy v Javě jsme viděli, že grafy se používají k nalezení nejkratší cesty mezi uzly kromě jiných aplikací.
Abychom našli nejkratší cestu mezi dvěma uzly grafu, většinou používáme algoritmus známý jako „ Dijkstrův algoritmus “. Tento algoritmus zůstává široce používaným algoritmem k hledání nejkratších cest v grafu nebo stromu.
=> Zkontrolujte VŠECHNY výukové programy Java zde
Co se naučíte:
Dijkstra's Algorithm In Java
Vzhledem k váženému grafu a výchozímu (zdrojovému) vrcholu v grafu se používá Dijkstrův algoritmus k nalezení nejkratší vzdálenosti od zdrojového uzlu ke všem ostatním uzlům v grafu.
V důsledku spuštěného Dijkstrova algoritmu v grafu získáme nejkratší strom cesty (SPT) se zdrojovým vrcholem jako root.
V Dijkstraově algoritmu udržujeme dvě sady nebo seznamy. Jeden obsahuje vrcholy, které jsou součástí stromu nejkratší cesty (SPT), a druhý obsahuje vrcholy, které jsou vyhodnocovány, aby byly zahrnuty do SPT. Proto pro každou iteraci najdeme vrchol z druhého seznamu, který má nejkratší cestu.
Níže je uveden pseudokód pro algoritmus nejkratší cesty Dijkstra.
jak najdu klíč zabezpečení sítě
Pseudo kód
Níže je uveden pseudokód pro tento algoritmus.
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
Pojďme si nyní vzít ukázkový graf a ilustrovat Dijkstrův nejkratší algoritmus cesty .
Zpočátku je sada SPT (nejkratší cesta) nastavena na nekonečno.
Začněme s vrcholem 0. Takže začneme tím, že dáme vrchol 0 do sptSet.
sptSet = {0, INF, INF, INF, INF, INF}.
Dále s vrcholem 0 v sptSet prozkoumáme jeho sousedy. Vrcholy 1 a 2 jsou dva sousední uzly 0 se vzdáleností 2, respektive 1.
Na výše uvedeném obrázku jsme také aktualizovali každý sousední vrchol (1 a 2) o jejich příslušnou vzdálenost od zdrojového vrcholu 0. Nyní vidíme, že vrchol 2 má minimální vzdálenost. Dále přidáme vrchol 2 do sptSet. Prozkoumáme také sousedy vrcholu 2.
Nyní hledáme vrchol s minimální vzdáleností a ty, které tam nejsou, v spt. Vybereme vrchol 1 se vzdáleností 2.
Jak vidíme na výše uvedeném obrázku, ze všech sousedních uzlů 2, 0 a 1 jsou již v sptSet, takže je ignorujeme. Z přilehlých uzlů 5 a 3 mají 5 nejméně nákladů. Takže jej přidáme do sptSet a prozkoumáme jeho přilehlé uzly.
Na výše uvedeném obrázku vidíme, že kromě uzlů 3 a 4 jsou všechny ostatní uzly v sptSet. Ze 3 a 4 má uzel 3 nejnižší náklady. Takže jsme to vložili do sptSet.
Jak je uvedeno výše, nyní nám zbývá pouze jeden vrchol, tj. 4 a jeho vzdálenost od kořenového uzlu je 16. Nakonec jej vložíme do sptSet, abychom získali finální sptSet = {0, 2, 1, 5, 3, 4}, který dává nám vzdálenost každého vrcholu od zdrojového uzlu 0.
Implementace Dijkstraho algoritmu v Javě
Implementace Dijkstraova nejkratšího algoritmu cesty v Javě lze dosáhnout dvěma způsoby. Můžeme buď použít prioritní fronty a seznam sousedů, nebo můžeme použít matici a pole sousedství.
V této části uvidíme obě implementace.
Použití prioritní fronty
V této implementaci používáme prioritní frontu k ukládání vrcholů s nejkratší vzdáleností. Graf je definován pomocí seznamu sousedů. Ukázkový program je uveden níže.
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 Výstup:
Používání matice sousedství
V tomto přístupu používáme k znázornění grafu matici sousedství. Pro spt set používáme pole.
Následující program ukazuje tuto implementaci.
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 Výstup:
Často kladené otázky
Otázka č. 1) Funguje Dijkstra pro neorientované grafy?
Odpovědět: Pokud je graf směrovaný nebo neorientovaný, v případě Dijkstrova algoritmu to nevadí. Tento algoritmus se týká pouze vrcholů v grafu a vah.
Otázka 2) Jaká je časová složitost Dijkstrova algoritmu?
Odpovědět: Časová složitost Dijkstrova algoritmu je O (V 2). Při implementaci s frontou min. Priority se časová složitost tohoto algoritmu sníží na O (V + E l o g V).
Otázka č. 3) Je Dijkstra chamtivý algoritmus?
Odpovědět: Ano, Dijkstra je chamtivý algoritmus. Podobně jako Primův algoritmus hledání minimálního rozpětí (MST), i tyto algoritmy začínají od kořenového vrcholu a vždy volí nejoptimálnější vrchol s minimální cestou.
Otázka č. 4) Je Dijkstra DFS nebo BFS?
Odpovědět: Není to ani jedno, ani druhé. Ale protože Dijkstrův algoritmus používá pro svoji implementaci prioritní frontu, lze jej považovat za blízký BFS.
Otázka č. 5) Kde se používá Dijkstrův algoritmus?
Odpovědět: Používá se většinou ve směrovacích protokolech, protože pomáhá najít nejkratší cestu z jednoho uzlu do druhého uzlu.
Závěr
V tomto tutoriálu jsme probrali Dijkstrův algoritmus. Tento algoritmus používáme k nalezení nejkratší cesty z kořenového uzlu k ostatním uzlům v grafu nebo stromu.
Obvykle implementujeme Dijkstrův algoritmus pomocí prioritní fronty, protože musíme najít minimální cestu. Můžeme také implementovat tento algoritmus pomocí matice sousedství. Oba tyto přístupy jsme probrali v tomto kurzu.
Doufáme, že vám tento návod pomůže.
=> Navštivte zde a prohlédněte si sérii školení Java pro všechny
Doporučené čtení
- Algoritmus binárního vyhledávání v Javě - implementace a příklady
- Bubble Sort In Java - Algoritmy třídění Java a příklady kódu
- Insertion Sort In Java - Alserith Sort Algorithm & examples
- Výběr řazení v Javě - Algoritmus řazení a příklady výběru
- QuickSort In Java - Algoritmus, ilustrace a implementace
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video
- Výukový program Java Reflection s příklady
- Jagged Array In Java - výukový program s příklady