Dijkstrin algoritam u Python & C++ (Primjer)

โšก Pametni saลพetak

Dijkstrin algoritam izraฤunava najkraฤ‡i put od jednog izvornog vrha do svakog drugog vrha u ponderiranom grafu s nenegativnim bridovima. Ova pohlepna metoda podupire Google Rutiranje mapa, usmjeravanje OSPF IP-a i bezbrojni sluฤajevi koriลกtenja najkraฤ‡eg puta u mreลพi.

  • ๐ŸŽฏ Osnovna ideja: Dijkstrin algoritam pohlepno proลกiruje najbliลพi neposjeฤ‡eni vrh, aลพurirajuฤ‡i udaljenosti susjeda sve dok svaki dostiลพni ฤvor ne ima svoju stvarnu najkraฤ‡u cijenu iz izvora.
  • ๐Ÿ”„ U usporedbi s BFS-om i DFS-om: BFS i DFS pronalaze bilo koji put bez razmatranja teลพina bridova, dok Dijkstra minimizira ukupni troลกak preko ponderiranih bridova.
  • ๐Ÿงญ Primjer korak po korak: Obraฤ‘eni graf sa 7 ponderiranih vrhova pokazuje kako se udaljenosti iterativno aลพuriraju i kako put 1-2-6-7 pobjeฤ‘uje s cijenom od 7.
  • ๐Ÿ’ป Jeziฤna pokrivenost: Oboje C++ i Python Implementacije demonstriraju verziju matrice susjednosti s funkcijom odabira minimalne udaljenosti.
  • โš ๏ธ Ograniฤenje: Dijkstra ne uspijeva na negativnim teลพinama bridova jer se finalizirani ฤvor nikada ne razmatra ponovno; koristite Bellman-Fordov model za grafove s negativnim bridovima.
  • ๐Ÿ“Š Sloลพenost: Naivna verzija s nizom izvrลกava se u vremenu i prostoru O(Vยฒ); red prioriteta smanjuje vrijeme na O(E log V) za rijetke grafove.

Dijkstrin algoritam najkraฤ‡eg puta

Koji je najkraฤ‡i put ili najkraฤ‡a udaljenost?

Put od izvornog vrha do odrediลกnog vrha koji koลกta minimalno je najkraฤ‡i put ili najkraฤ‡a udaljenost. U teoriji grafova moguฤ‡e je imati viลกe ruta od izvora do odrediลกta. Meฤ‘u tim rutama, ako postoji ruta koja koลกta minimalno, nazivamo je najkraฤ‡im putem.

Ovdje โ€žtroลกakโ€œ znaฤi broj ฤvorova u ruti ili zbroj troลกkova na svakom bridu. Put moลพe imati jedan ili viลกe bridova. Veza izmeฤ‘u dva vrha naziva se โ€žbridโ€œ. Postoje razliฤite vrste algoritama za najkraฤ‡i put, kao ลกto su Dijkstrin algoritam i Bellman-Fordov algoritam.

Ovdje raspravljamo o Dijkstrinom algoritmu. Pogledajmo sljedeฤ‡i ponderirani graf:

Neusmjereni ponderirani graf

Neusmjereni ponderirani graf

  • Pojam โ€žponderiranoโ€œ oznaฤava troลกak premjeลกtanja s jednog ฤvora na drugi. Na primjer, premjeลกtanjem s ฤvora 1 na ฤvor 2, troลกak ili ponder je 1.
  • Put izmeฤ‘u ฤvora 1 i ฤvora 2 naziva se rub.
  • โ€žNeusmjerenoโ€œ znaฤi da se moลพete kretati s jednog ฤvora na drugi i natrag na prethodni ฤvor. Dakle, ako pokuลกamo pronaฤ‡i sve rute od ฤvora 1 do ฤvora 7, one ฤ‡e biti:
Ruta ili putTroลกak
1-2-6-7(1+3+3) = 7
1-2-3-7(1+9+1) = 11
1-3-7(7+1) = 8
1-4-5-7(6+2+5) = 13

Meฤ‘u ove ฤetiri rute, moลพemo vidjeti da prva ruta koลกta 7. Dakle, to je najkraฤ‡i put u smislu troลกkova.

Najkraฤ‡i put

Najkraฤ‡i put

Kako radi Dijkstrin algoritam

Dijkstrin algoritam moลพe pronaฤ‡i najkraฤ‡u udaljenost i u usmjerenim i u neusmjerenim ponderiranim grafovima. Ovaj algoritam je pohlepni jer uvijek bira najkraฤ‡i ili najbliลพi ฤvor iz ishodiลกta. Pojam "pohlepni" znaฤi da ฤ‡e algoritam izmeฤ‘u skupa ishoda ili rezultata odabrati najbolji od njih.

Ovdje pokuลกavamo pronaฤ‡i najkraฤ‡e putove meฤ‘u svim ostalim rutama. Dakle, Dijkstrin algoritam pronalazi sve najkraฤ‡e putove od jednog izvornog ฤvora. Kao rezultat toga, ponaลกa se kao pohlepni algoritam.

U odjeljku "primjer" u nastavku vidjet ฤ‡ete postupni pristup. Funkcionira na sljedeฤ‡i naฤin:

Korak 1) Inicijalizirajte poฤetni ฤvor s cijenom 0, a ostale ฤvorove s beskonaฤnom cijenom.
Korak 2) Odrลพavati niz ili listu za ฤuvanje track posjeฤ‡enih ฤvorova.
Korak 3) Aลพurirajte troลกak ฤvora s minimalnim troลกkom. To se moลพe uฤiniti usporedbom trenutnog troลกka s troลกkom puta (prikazano u odjeljku s primjerima).
Korak 4) Nastavite korak 3 dok se ne posjete svi ฤvorovi.

Nakon dovrลกetka svih ovih koraka pronaฤ‡i ฤ‡emo put koji koลกta minimalno od izvora do odrediลกta.

Razlika izmeฤ‘u Dijkstre i BFS, DFS

Glavna razlika izmeฤ‘u Dijkstre i BFS-DFS-a je u tome ลกto je Dijkstra algoritam za pronalaลพenje najkraฤ‡eg puta, dok su BFS i DFS opฤ‡i algoritmi za pronalaลพenje puta. U opฤ‡im sluฤajevima, BFS i DFS ne uzimaju u obzir cijenu ruba prilikom pronalaลพenja puta. Dakle, ovi algoritmi ne mogu jamฤiti najkraฤ‡i put.

2D mreลพna demonstracija rada BFS-a

Demonstracija 2D mreลพe BFS

Algosketch, prikazuje BFS demonstraciju

Ova demonstracija pokazuje da BFS pronalazi samo put. Meฤ‘utim, ne mari za teลพinu staze. BFS (Pretraลพivanje u ลกirinu) pretpostavlja da ฤ‡e putovanje od jednog ฤvora do drugog koลกtati samo 1.

Pogledajmo primjer grafa:

Primjer grafa demonstracije 2D mreลพe

Ovdje BFS pronalazi put na razini 2. BFS prelazi graf po razinama. Dakle, putuje ovako:

Korak 1) Poฤnite od ฤvora โ€ž1โ€œ i posjetite sve susjedne ฤvorove 2, 3, 4.

Korak 2) Oznaฤi ฤvorove 2, 3, 4 kao razinu 1 i posjeti njihove susjedne ฤvorove. Nastavit ฤ‡e istraลพivati โ€‹โ€‹sve susjedne ฤvorove dok ne doฤ‘e do odrediลกnog ฤvora.

ล to se tiฤe DFS-a, proฤ‡i ฤ‡e put od 1 do 7 na sljedeฤ‡i naฤin:

  • 1โ†’2โ†’3โ†’7 (Originalni troลกak 10, DFS troลกak 3)
  • 1โ†’2โ†’6โ†’7 (Originalni troลกak 7, DFS troลกak 3)
  • 1โ†’3โ†’7 (Originalni troลกak 8, DFS troลกak 2)
  • 1โ†’4โ†’5โ†’7 (Originalni troลกak 13, DFS troลกak 3)

Kao ลกto vidimo, DFS izraฤunava cijenu puta s brojem bridova. DFS radi sljedeฤ‡e:

  • DFS moลพe pronaฤ‡i put od izvora (poฤetnog vrha) do odrediลกta.
  • Ne moลพe jamฤiti je li put otkriven od izvornog ฤvora do odrediลกta najkraฤ‡i put ili nije.

Meฤ‘utim, u smislu Dijkstrinog algoritma, on bira rubove na temelju njihove cijene. Kao pohlepni algoritam, odabrat ฤ‡e putove s minimalnom cijenom.

Primjer Dijkstrinog algoritma

Dijkstrin algoritam koristi cijenu ili teลพinu za izraฤun ukupne cijene puta.

Primjer Dijkstrasovog algoritma

Cilj Dijkstrinog algoritma je minimizirati ovaj ukupni troลกak ili teลพinu. U gore prikazanom primjeru pronalazimo najbolje putove od ฤvora 1 do ฤvora 7, zatim izraฤunavamo sve troลกkove.

U Dijkstrinom algoritmu, pronaฤ‡i ฤ‡e se najkraฤ‡i putevi izraฤunavanjem teลพina. Neฤ‡e se traลพiti sve moguฤ‡e puteve. Demonstrirajmo Dijkstrin algoritam na primjeru. Na primjer, zamoljeni ste da pronaฤ‘ete najkraฤ‡i put od ฤvora 1 do 7.

U nastavku su navedeni koraci za ovaj postupak:

Korak 1) Inicijalizirajte poฤetnu cijenu ฤvora na 0. Dodijelite "Inf" do ostatka ฤvorova. To znaฤi da ne postoji put izmeฤ‘u izvora i ฤvora ili put joลก nije posjeฤ‡en.

Inicijalizacija Dijkstraovog algoritma

Korak 2) Kada odaberete ฤvor 1, bit ฤ‡e oznaฤen kao posjeฤ‡en. Zatim aลพurirajte sve susjedne ฤvorove ฤvora 1. 2, 3, 4 su susjedni ฤvorovi ฤvora 1.

Dok aลพuriramo troลกak, moramo slijediti postupak u nastavku:

Postupak aลพuriranja Dijkstraovog algoritma

Troลกak svakog ฤvora moลพemo aลพurirati pomoฤ‡u gornje formule. Na primjer, bili smo na ฤvoru 1 i trebali smo aลพurirati troลกak susjednih ฤvorova 2, 3 i 4. Nakon aลพuriranja, troลกkovi ฤ‡e izgledati ovako:

Dijkstrasov algoritam nakon prvog aลพuriranja

Korak 3) Za ฤvor โ€ž2โ€œ, susjedi su 6 i 3. Aลพuriramo troลกak na โ€ž6โ€œ usporeฤ‘ujuฤ‡i beskonaฤnost (trenutnu vrijednost) s troลกkom ฤvora 2 + troลกak puta od 2 do 6. Jednostavno reฤeno, ฤvor โ€ž6โ€œ imat ฤ‡e troลกak 1 + 3 ili 4.

ฤŒvor aลพuriranja Dijkstraovog algoritma 6

ฤŒvor 3 je susjed ฤvora 2. Meฤ‘utim, izraฤunali smo njegov troลกak u prethodnom koraku, koji je bio 7. Sada, ako je naลก put 1-2-3, ฤvor 3 ฤ‡e imati troลกak 10. Put 1-2- 3 ฤ‡e koลกtati 10, dok ฤ‡e 1 do 3 koลกtati 7.

Korak 4) Za ฤvor 3, susjedni ฤvor je 7. Dakle, usporeฤ‘ujuฤ‡i trenutnu vrijednost ฤvora 7 s cijenom puta (7+1) ili 8, aลพurirat ฤ‡emo cijenu ฤvora 7. To je 8. Dakle, pronalazimo put od ฤvora 1 do ฤvora 7, a on je 1โ†’3โ†’7. Cijena je 8.

Korak 5) Za ฤvor 4, aลพurirat ฤ‡emo cijenu susjednog ฤvora u skladu s tim. Dakle, ฤvor "5" imat ฤ‡e aลพuriranu cijenu od 8. Nakon koraka 4 i 5, izgledat ฤ‡e ovako:

Dijkstrasov algoritam nakon koraka 4 5

Sada put 1-3-7 ima cijenu 8 (prije). ฤŒvor "7" nije oznaฤen kao posjeฤ‡en jer do ฤvora "7" moลพemo doฤ‡i iz ฤvora "6". Put "1-2-6" imao je cijenu 4. Dakle, put 1-2-6-7 imat ฤ‡e cijenu 7.

Kako je 7 < 8, najkraฤ‡i put od izvornog vrha "1" do odrediลกnog vrha "7" bit ฤ‡e 1-2-6-7, a cijena je 7. Prije je bila 1-3-7, a cijena je bila 8. Dakle, konaฤni graf ฤ‡e izgledati ovako:

Konaฤni graf Dijkstrasovog algoritma

Rub oznaฤen crnom crtom je naลก najkraฤ‡i put od 1 do 7, a koลกtat ฤ‡e nas 7.

Nadimak Code Dijkstrin algoritam

Evo pseudokoda za Dijkstrin algoritam:

Dijkstra(G, S):
  for each vertex V in G
    distance[V] <- Infinity
    previous[V] <- NULL
    if V does not equal S, then,
      (priority queue) Q.push(V)
  distance[S] = 0
  While Q is not empty
    U <- Extract the MIN from Q
    For each unvisited adjacent V of U
      TotalDistance <- distance[U] + edge_cost(U, V)
      if TotalDistance is less than distance[V], then
        distance[V] <- TotalDistance
        previous[V] <- U
  return distance, previous

C++ Implementacija Dijkstrinog algoritma

Za implementaciju Dijkstrinog algoritma pomoฤ‡u C++, evo koda:

#include <bits/stdc++.h>
using namespace std;
#define size 7
int minimumDistance(int distance[], bool visited[]) {
  int min = INT_MAX;
  int min_index = INT_MAX;
  for (int i = 0; i < size; i++) {
    if (!visited[i] && distance[i] <= min) {
      min = distance[i];
      min_index = i;
    }
  }
  return min_index;
}
void printParentPath(int parent[], int i) {
  if (parent[i] == -1) {
    return;
  }
  printParentPath(parent, parent[i]);
  cout << i + 1 << " ";
}
void dijkstra(int graph[size][size], int source) {
  int distance[size];
  bool visited[size];
  int parent[size];
  for (int i = 0; i < size; i++) {
    parent[0] = -1;
    distance[i] = INT_MAX;
    visited[i] = false;
  }
  distance[source] = 0;
  for (int i = 0; i < size - 1; i++) {
    int U = minimumDistance(distance, visited);
    visited[U] = true;
    for (int j = 0; j < size; j++) {
      int curr_distance = distance[U] + graph[U][j];
      if (!visited[j] && graph[U][j] &&
          curr_distance < distance[j]) {
        parent[j] = U;
        distance[j] = curr_distance;
      }
    }
  }
  cout << "Vertex\t\tDistance\tPath" << endl;
  for (int i = 1; i < size; i++) {
    cout << source + 1 << "->" << i + 1 << "\t\t" << distance[i] << "\t\t"
         << source + 1 << " ";
    printParentPath(parent, i);
    cout << endl;
  }
}
int main() {
  int graph[size][size] = {{0, 1, 7, 6, 0, 0, 0}, {1, 0, 9, 0, 0, 3, 0},
                           {7, 9, 0, 0, 0, 0, 1}, {6, 0, 0, 0, 2, 0, 0},
                           {0, 0, 0, 2, 0, 0, 0}, {0, 3, 0, 0, 0, 0, 3},
                           {0, 0, 0, 0, 5, 3, 0}};
  dijkstra(graph, 0);
}

Izlaz:

Vertex     Distance        Path

1->2           1             1 2
1->3           7             1 3
1->4           6             1 4
1->5           8             1 4 5
1->6           4             1 2 6
1->7           7             1 2 6 7

Python Implementacija Dijkstrinog algoritma

Za implementaciju Dijkstrinog algoritma pomoฤ‡u Python, evo koda:

num_of_vertex = 7
def minimumDistance(distance, visited):
    _min = 1e11
    min_index = 1e11
    for i in range(num_of_vertex):
        if not visited[i] and distance[i] <= _min:
            _min = distance[i]
            min_index = i
    return min_index

def printParentNode(parent, i):
    if parent[i] == -1:
        return
    printParentNode(parent, parent[i])
    print("{} ".format(i + 1), end="")

def dijkstra(graph, src):
    distance = list()
    visited = list()
    parent = list()
    for i in range(num_of_vertex):
        parent.append(-1)
        distance.append(1e11)
        visited.append(False)
    distance[src] = 0
    for i in range(num_of_vertex - 1):
        U = minimumDistance(distance, visited)
        visited[U] = True
        for j in range(num_of_vertex):
            curr_distance = distance[U] + graph[U][j]
            if not visited[j] and graph[U][j] and curr_distance < distance[j]:
                parent[j] = U
                distance[j] = curr_distance
    print("Vertex\t\tDistance\tPath")
    for i in range(num_of_vertex):
        print("{}->{}\t\t{}\t\t{} ".format(src + 1, i + 1, distance[i], src + 1), end="")
        printParentNode(parent, i)
        print("")

graph = [
    [0, 1, 7, 6, 0, 0, 0],
    [1, 0, 9, 0, 0, 3, 0],
    [7, 9, 0, 0, 0, 0, 1],
    [6, 0, 0, 0, 2, 0, 0],
    [0, 0, 0, 2, 0, 0, 0],
    [0, 3, 0, 0, 0, 0, 3],
    [0, 0, 0, 0, 5, 3, 0]
]
dijkstra(graph, 0)

Izlaz:

Vertex     Distance        Path

1->1           0              1
1->2           1              1 2
1->3           7              1 3
1->4           6              1 4
1->5           8              1 4 5
1->6           4              1 2 6
1->7           7              1 2 6 7

Moลพemo vidjeti da algoritam izraฤunava najkraฤ‡u udaljenost od izvornog ฤvora.

Primjena Dijkstra algoritma

Dijkstrin algoritam ima ลกirok raspon primjena. Meฤ‘u njima, ลกiroko se koristi u podruฤju umreลพavanja. Evo nekih primjena Dijkstrinog algoritma u stvarnom ลพivotu:

Dijkstra u Google Karte: Ovaj algoritam je osnova za pronalaลพenje najkraฤ‡ih putova, kao ลกto moลพemo vidjeti iz gornjeg isjeฤka koda.

Primjena Dijkstra algoritma Google Karte

Google ne koristi jednostavni Dijkstrin algoritam. Umjesto toga, koristi modificiranu verziju. Kada odaberete odrediลกte, prikazuje vam viลกe putova u Google Karte. Meฤ‘u tim putovima, neki su sortirani za korisnika. Ti se putovi odabiru na temelju โ€žvremenaโ€œ. Dakle, โ€žvrijemeโ€œ je cijena ruba za najkraฤ‡i put.

Dijkstra u IP usmjeravanju: IP usmjeravanje je mreลพna terminologija. Opisuje kako se vaลก podatkovni paket ลกalje primatelju putem razliฤitih putova. Ti putovi se sastoje od usmjerivaฤa, posluลพitelja i druge opreme. U IP usmjeravanju postoje razliฤite vrste protokola.

Ovi protokoli pomaลพu usmjerivaฤu da pronaฤ‘e najkraฤ‡e putove za slanje podataka. Jedan od naziva protokola je โ€žOSPF (Open Shortest Path First - Prvo Otvori Najkraฤ‡i Put)โ€œ. OSPF koristi Dijkstrin algoritam. Usmjerivaฤ odrลพava tablicu ruta. Svaki usmjerivaฤ dijeli svoju tablicu sa susjednim usmjerivaฤima. Nakon ลกto prime aลพuriranu tablicu, moraju ponovno izraฤunati sve putove. U tom trenutku usmjerivaฤ koristi Dijkstrin algoritam.

Ograniฤenje Dijkstrinog algoritma

Dijkstrin algoritam ne moลพe jamฤiti najkraฤ‡i put u grafu s negativnim bridovima. Dijkstrin algoritam slijedi ove principe:

  • Od jednog ฤvora do drugog iฤ‡i ฤ‡e jedan najkraฤ‡i put.
  • Jednom kada se odabere najkraฤ‡i put izmeฤ‘u dva ฤvora, neฤ‡e se ponovno izraฤunati.

Ovdje primijetite dva primjera s negativnim rubovima.

Ograniฤenje negativnih rubova Dijkstrasovog algoritma

Na lijevom grafu, Postoje tri vrha. Dijkstra ฤ‡e se izvrลกavati na grafu na sljedeฤ‡i naฤin:

Korak 1) Poฤetni vrh "1" bit ฤ‡e inicijaliziran na nulu. Ostali ฤvorovi ฤ‡e imati beskonaฤnost.

Ograniฤenje Dijkstrasovog algoritma korak 1

Korak 2) Oznaฤi ฤvor "1" kao posjeฤ‡en i uvrsti ga u najkraฤ‡i put.

Korak 3) Udaljenost izvornog ฤvora 1 do ฤvorova โ€ž2โ€œ i โ€ž3โ€œ postavljena je na beskonaฤnost, buduฤ‡i da najkraฤ‡i put tek treba izraฤunati. Dakle, svaki put koji koลกta manje od beskonaฤnosti bit ฤ‡e dodan najkraฤ‡em putu (pohlepni pristup).

Korak 4) Aลพuriranje udaljenosti od izvornog vrha "1" na "2". Trenutna teลพina bit ฤ‡e 5 (5 < beskonaฤno). Sliฤno tome, aลพurirajte udaljenost od ฤvora "1" na "3" s teลพinom 3.

Ograniฤenje Dijkstrasovog algoritma korak 4

Korak 5) Ako sada provjerimo najkraฤ‡e udaljenosti od ฤvora โ€ž1โ€œ, otkrit ฤ‡emo da je 5 najkraฤ‡a udaljenost za rub 1โ†’2. Dakle, ฤvor โ€ž2โ€œ bit ฤ‡e oznaฤen kao posjeฤ‡en. Sliฤno tome, ฤvor โ€ž3โ€œ takoฤ‘er ฤ‡e biti oznaฤen kao posjeฤ‡en jer je najkraฤ‡a udaljenost 3.

Meฤ‘utim, ako promatramo, postoji put 1-3-2 koji ฤ‡e koลกtati samo 2. Ali Dijkstra pokazuje da je od ฤvora "1" do ฤvora "2" najkraฤ‡a udaljenost 5. Dakle, Dijkstra nije ispravno izraฤunao najkraฤ‡u udaljenost. Razlog je taj ลกto je Dijkstra pohlepni algoritam. Dakle, nakon ลกto je ฤvor oznaฤen kao posjeฤ‡en, neฤ‡e se ponovno razmatrati, iako bi mogao biti dostupan kraฤ‡i put. Ovaj problem se javlja samo kada rubovi imaju negativne troลกkove ili rubove negativne teลพine.

Dijkstra ne uspijeva izraฤunati najkraฤ‡i put izmeฤ‘u dva ฤvora u ovom scenariju. Kao rezultat toga, ovaj algoritam ima neke nedostatke. Za rjeลกavanje ovog problema negativnih rubova koristi se drugi algoritam nazvan "Bellman-Fordov algoritam". Taj algoritam moลพe raditi s negativnim rubovima.

Sloลพenost Dijkstrinog algoritma

Gornja implementacija koristila je dvije petlje "za". Ove se petlje pokreฤ‡u za odreฤ‘eni broj vrhova. Dakle, vremenska sloลพenost je O(Vยฒ)Ovdje je izraz โ€žOโ€œ oznaka koja daje pretpostavku za Dijkstrin algoritam.

Graf moลพemo pohraniti pomoฤ‡u "reda prioriteta". Red prioriteta je binarna struktura podataka hrpe. Bit ฤ‡e uฤinkovitija od 2D matrice. Rub s minimalnim troลกkovima imat ฤ‡e visoki prioritet. Tada ฤ‡e vremenska sloลพenost biti O(E log V). Ovdje je E broj bridova, a V broj vrhova.

Sloลพenost prostora je O(Vยฒ), buduฤ‡i da koristimo matricu susjedstva (2D niz). Sloลพenost prostora moลพe se optimizirati koriลกtenjem popisa susjedstva ili strukture podataka reda ฤekanja.

Pitanja i odgovori

Agenti za planiranje puta umjetne inteligencije u robotici, autonomnim vozilima i NPC-ovima u igrama koriste Dijkstrin algoritam za pronalaลพenje ruta s najniลพim troลกkovima na ponderiranim grafovima. Okruลพenja za uฤenje s potkrepljenjem takoฤ‘er se oslanjaju na njega za izraฤunavanje optimalnih referentnih putova za raspodjelu nagrada.ping i evaluacija.

Da. AI asistenti za kodiranje poput GitHub Copilota i GPT-a mogu generirati Dijkstrin algoritam u Python, C++, ili Java, ukljuฤujuฤ‡i varijante reda s prioritetom koriลกtenjem hrpa. Takoฤ‘er mogu ispisati stvarni najkraฤ‡i put ili prilagoditi kod grafovima pohranjenim kao liste susjednosti.

Koristeฤ‡i jednostavan niz za pronalaลพenje minimalnog ฤvora, Dijkstrin algoritam se izvrลกava u vremenu O(Vยฒ). S redom prioriteta binarne hrpe pada na O((V + E) log V), a s Fibonaccijevom hrpom doseลพe O(E + V log V), ลกto je najbolje za rijetke grafove.

Dijkstra finalizira vrh ฤim odabere trenutnu minimalnu udaljenost. Kasniji negativni rub mogao bi uฤiniti dulji put jeftinijim, ali finalizirani vrh se nikada ne posjeฤ‡uje ponovno, pa algoritam prijavljuje netoฤnu najkraฤ‡u udaljenost.

Odaberite Dijkstrin model kada je svaka teลพina brida nenegativna jer je brลพi pri O((V+E) log V). Odaberite Bellman-Fordov model kada bridovi mogu biti negativni ili trebate detektirati cikluse s negativnom teลพinom; njegovo vrijeme izvoฤ‘enja O(VยทE) je kompromis.

Google Karte koriste varijante i nasljednike Dijkstre, ukljuฤujuฤ‡i A* i Contraccione hijerarhije, podeลกene za cestovne mreลพe i promet u stvarnom vremenu. Temeljna ideja pohlepnog ลกirenja minimalnim akumuliranim troลกkovima i dalje je Dijkstrin kljuฤni doprinos.

A* proลกiruje Dijkstru dodavanjem heuristiฤke procjene udaljenosti do cilja, proลกirujuฤ‡i manji broj ฤvorova kada je dostupna dobra heuristika. Dijkstra istraลพuje u svim smjerovima, dok A* pristrasno pretraลพuje prema cilju, ลกto ga ฤini brลพim u praksi.

Osim karata, Dijkstra omoguฤ‡uje OSPF i IS-IS protokole usmjeravanja na internetu, optimizaciju topologije mreลพe, usmjeravanje telefonskih poziva, planiranje kretanja robotike, upite za najkraฤ‡e veze na druลกtvenim mreลพama i minimiziranje troลกkova leta zrakoplovnim kompanijama.

Saลพmite ovu objavu uz: