Dijkstrův algoritmus
Dijkstrův algoritmus

Dijkstrův algoritmus je nejrychlejší známý algoritmus pro nalezení všech nejkratších cest ze zadaného uzlu do ostatních uzlů grafu, který neobsahuje hrany záporné délky. Algoritmus byl vymyšlen nizozemským informatikem Edsgerem Dijkstrou v roce 1959.

Princip

Na Dijkstrův algoritmus lze pohlížet jako na zobecněné prohledávání grafu do šířky, při kterém se vlna nešíří na základě počtu hran od zdroje, ale vzdálenosti od zdroje (ve smyslu váhy hran). Tato vlna proto zpracovává jen ty uzly, k nimž již byla nalezena nejkratší cesta.

Dijkstrův algoritmus si uchovává všechny uzly v prioritní frontě řazené dle vzdálenosti od zdroje - v první iteraci má pouze zdroj vzdálenost 0, všechny ostatní uzly nekonečno. Algoritmus v každém svém kroku vybere z fronty uzel s nejvyšší prioritou (nejnižší vzdáleností od již zpracované části) a zařadí jej mezi zpracované uzly. Poté projde všechny jeho dosud nezpracované potomky, přidá je do fronty, nejsou-li tam již obsaženi, a ověří, zda-li nejsou blíže zdroji, než byli před zařazením právě vybraného uzlu mezi zpracované. To znamená, že pro všechny potomky ověřuje:


vzdálenost_{zpracovávaný} + délkaHrany_{zpracovávaný, \\; potomek} < vzdálenost_{potomek}

Pokud nerovnost platí, tak danému potomkovi nastaví novou vzdálenost a označí za jeho předka zpracovávaný uzel. Po průchodu přes všechny potomky algoritmus vybere z fronty uzel s nejvyšší prioritou a celý krok opakuje.

Algorimus terminuje v okamžiku, kdy jsou zpracovány všechny uzly (prioritní fronta je prázdná).

Dijkstrův algoritmus je použitelný jen tehdy, obsahuje-li graf pouze nezáporně ohodnocené hrany - v opačném případě není schopen garantovat, že při zpracování uzlu byla již nalezena nejkratší možná cesta.

Složitost

Složitost Dijkstrova algoritmu závisí na implementaci prioritní fronty. V případě její implementace pomocí sekvenčního vyhledávání je složitost algoritmu O(\\vert U \\vert ^{2}), při použití binární haldy O(\\vert H \\vert \\log_{2} \\vert U \\vert).


Kód

01./**
02. * Dijkstruv algoritmus
03. * @param d matice delek, pozice [0 1] = 2 znamena, ze z uzlu 0 vede do uzlu 1 hrana delky 2
04. * @param from uzel ze ktereho se hledaji nejkratsi cesty
05. * @return strom predchudcu (z ciloveho uzlu znaci cestu do uzlu from)
06. */
07.procedure int[] doDijkstra(d, from) {
08.    //vlozi vsechny prvky do prioritni fronty (radi vzestupne dle vzdalenosti), uzel from ma vzdalenost 0, vsechny ostatni nekonecno
09.    Q = InsertAllNodesToTheQueue(d, from)
10.    CLOSED = {} //uzevrene uzly - prazdna mnozina
11.    predecessors = new array[d.nodeCount] //pole predchudcu
12. 
13.    while !Q.isEmpty() do
14.        //vrat uzel v nejnizsi vzdalenosti a odstan jej z fronty
15.        node = Q.extractMin()
16.        CLOSED.add(node) //uzavri uzel
17.         
18.        //zkrat vzdalenosti
19.        for a in Adj(node) do //pro vsechny potomky uzlu
20.            if !CLOSED.contains(a) //pokud jiz nebyl potomek uzavren
21.                //pokud se pridanim uzlu vzdalenost potomka  snizila                   
22.                if Q[node].distance + d[node][a] < Q[a].distance
23.                    //zmen prioritu (vzdalenost) uzlu
24.                    Q[a].distance = Q[node].distance + d[node][a]
25.                    //zmen predka uzlu a na node
26.                    predecessors[a] = node  
27. 
28.    return predecessors
01./**
02. * Dijkstruv algoritmus
03. * @param d matice delek (Integer.MAX_VALUE pokud hrana mezi uzly neexistuje)
04. * @param from uzel ze ktereho se hledaji nejkratsi cesty
05. * @return strom predchudcu (z ciloveho uzlu znaci cestu do uzlu from)
06. */
07.public static int[] doDijkstra(int[][] d, int from) {
08.    Set<Integer> set = new HashSet<Integer>();
09.    set.add(from);
10. 
11.    boolean[] closed = new boolean[d.length];
12.    int[] distances = new int[d.length];
13.    for (int i = 0; i < d.length; i++) {
14.        if (i != from) {
15.            distances[i] = Integer.MAX_VALUE;
16.        } else {
17.            distances[i] = 0;
18.        }
19.    }
20. 
21. 
22.    int[] predecessors = new int[d.length];
23.    predecessors[from] = -1;
24. 
25.    while (!set.isEmpty()) {
26.        //najdi nejblizsi dosazitelny uzel
27.        int minDistance = Integer.MAX_VALUE;
28.        int node = -1;
29.        for(Integer i : set){
30.            if(distances[i] < minDistance){
31.                minDistance = distances[i];
32.                node = i;
33.            }
34.        }
35. 
36.        set.remove(node);
37.        closed[node] = true;
38.         
39.        //zkrat vzdalenosti
40.        for (int i = 0; i < d.length; i++) {
41.            //existuje tam hrana
42.            if (d[node][i] != Integer.MAX_VALUE) {
43.                if (!closed[i]) {
44.                    //cesta se zkrati
45.                    if (distances[node] + d[node][i] < distances[i]) {
46.                        distances[i] = distances[node] + d[node][i];
47.                        predecessors[i] = node;
48.                        set.add(i); // prida uzel mezi kandidaty, pokud je jiz obsazen, nic se nestane
49.                    }
50.                }
51.            }
52.        }
53.    }
54.    return predecessors;
55.}

Literatura

  • KOLÁŘ, Josef. Teoretická informatika. 2. vyd. Praha : Česká informatická společnost, 2004. 205 s. ISBN 80-900853-8-5.

SEO od společnosti Digital Pylon


Online casino s algoritmem

České casino online online slot-vegas.cz

Hrajte nejlepší hry jako je GoodGame Empire.





Zajímavé články: Jak najít práci snů? Zvolte kariéru v IT!, Češi mají rádi hrací automaty online, Jak funguje algoritmické obchodování Casino, Online výuka Algoritmus a online marketing mají svá pravidla, Automaty, Matematický vliv, Ratings, Jak fungují algoritmy hazardních her online: více znalostí, více peněz, SYPWAI - nástroj pro vědecký vývoj, Vynikají na globálním trhu: Nejlepší vývojáři softwaru pro online výherní automaty, Jak si vybrat nejlepší české online casino, Proč byste měli hrát online casino VPN revoluce, Kde najdeme algoritmy v každodenním životě?, Čeká vás pracovní pohovor mimo město? Podívejte se, jak dokonale zvládnout včasný příchod, 5 úžasných technologií ze světa hazardních her, Mirror and access to Mostbet, Svou kancelář můžete mít stále po ruce, Jaké výhody má digitalizovaná firma oproti off-line konkurenci?, Jaký systém vybrat pro snadné řízení výroby?, Nahradí umělá inteligence ajťáky?, Důvody, proč používat SnapTik ke stahování videí TikTok, Dokonalý den na pláži: Co si vzít s sebou, aby byl výlet zábavný a bezpečný?, Jak přežít dlouhý let?, Go pay GoodGame Empire, Blockchain, Rozhovor, Umělá inteligence, Ochranná známka pre softvér: Prečo ju registrovať?, Role kryptografických algoritmů v zabezpečení online kasin, Jaké jsou náklady na nákup 3D tiskárny?, Jak algoritmy vylepšují online zážitky v roce 2025,


Doporučujeme

Internet pro vaši firmu na míru

https://www.algoritmy.net