Algoritmul lui Prim
Algoritmul lui Prim este un algoritm din teoria grafurilor care găsește arborele parțial de cost minim al unui graf conex ponderat. Înseamnă că găsește submulțimea muchiilor care formează un arbore care include toate vârfurile și al cărui cost este minimizat. Algoritmul a fost descoperit în 1930 de către matematicianul Vojtěch Jarník și apoi, independent, de informaticienii Robert C. Prim în 1957 și redescoperit de Edsger Dijkstra în 1959. De aceea mai este numit Algoritmul DJP, algoritmul Jarník sau algoritmul Prim-Jarník.
Descriere
[modificare | modificare sursă]Algoritmul incrementează mărimea unui arbore, pornind de la un nod, până când sunt incluse toate nodurile.
- Intrare: Un graf conex ponderat cu nodurile V și muchiile E.
- Initializare: Vnou = {x}, unde x este un nod arbitrar (punct de plecare) din V, Enou= {}
- repetă până când Vnou=V:
- Alege muchia (u,v) din E de cost minim astfel încât u este în Vnou și v nu e (dacă există mai multe astfel de muchii, se alege arbitrar)
- Se adaugă v la Vnou, (u,v) la Enou
- Ieșire: Vnou și Enou descriu arborele parțial de cost minim
Exemplu
[modificare | modificare sursă]Pseudocod
[modificare | modificare sursă]Min-heap
[modificare | modificare sursă]- Inițializare
- intrare: Un graf, o funcție care returnează costul muchiilor și un nod inițial r
plasează toate nodurile în mulțimea celor nevizitate, adaugă nodul inițial la arbore și plasează toate nodurile într-un min-heap.
for fiecare v in graf
distanțăMin [v] ← ∞
părinte [v] ← -1
listaDeAdiac [v] ← mulțimeaVidă
înQ [v] ← true
distanță [r] ← 0
Q ← V
- Algoritm
În descrierea algoritmului de mai sus,
- nodProxim este Q[0], acum ultim
- vecini este v din Q unde distanța față de v < ∞, după ce vârful proxim este eliminat
- nevizitat este v din Q unde distanța față de v = ∞, după ce vârful proxim este eliminat
Bucla while se va termina când nu mai există noduri care pot fi returnate.
- complexitate în timp: V pentru buclă, log(V) pentru eliminare
while ultim ← eliminăMin(Q)
înQ [ultim] ← false
adaugă ultim la listaDeAdiac [părinte [ultim]]
adaugă părinte [ultim] la listaDeAdiac [ultim]
- complexitate în timp: E/V, numărul mediu de noduri
for each adiacent al lui ultim
if (înQ [adiacent]) și (cost(ultim, adiacent) < distanțăMin [adiacent])
părinte [adiacent] ← ultim
distanțăMin [adiacent] ← cost(ultim, adiacent)
- complexitate în timp: log(V), înățimea heap-ului
update adiacent în Q, ordonează după distanțăMin