Algoritmul lui Prim
De la Wikipedia, enciclopedia liberă
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.
Cuprins |
[modifică] Descriere
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
[modifică] Exemplu
[modifică] Pseudocod
[modifică] Min-heap
- 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