Prim's algorithm (tsz. Prim's algorithms)
Prim algoritmusa egy gráfalapú, girbegurba (greedy) módszer a minimális feszítőfa (Minimum Spanning Tree – MST) előállítására összefüggő, súlyozott, irányítatlan gráfokban. A cél egy olyan fa kiválasztása, amely lefedi az összes csúcsot úgy, hogy az élek súlyösszege minimális legyen.
2. Az algoritmus fő gondolata
Ez a girbegurba kiválasztási mód biztosítja, hogy végül egy minimális súlyú fa jöjjön létre.
3. Pseudokód
Prim(G, w, r): // G = (V, E) súlyozott gráf, w: E→ℝ súlyfüggvény, r: kiinduló csúcs Inicializáljuk a kulcsértéket minden v ∈ V esetén: key = ∞ parent = NIL key = 0 Q = V // minden csúcs a prioritáskúrába (min-heap) kerül while Q nem üres: u = Extract-Min(Q) // kivesszük azt a csúcsot, melynek key-értéke minimális for minden (u, v) ∈ E: ha v ∈ Q és w(u, v) < key: parent = u key = w(u, v) // A parent tömb szemlélteti a feszítőfát, és az MST élei: (parent, v) minden v≠r-re.
4. Adatszerkezetek és műveletek
key
) alapján tudjuk gyorsan kiválasztani a legkisebb él-súlyú „határcsúcsot”.key
: azt az élsúlyt tartja, amelyen keresztül a v csúcs bekerülne a fába.parent
: a feszítőfa elődjét jelöli, azaz ha parent = u, akkor az MST-ben (u, v) él szerepel.
5. Időkomplexitás
Extract-Min
művelet: alkalommal fut (minden csúcs egyszer kerül ki), összesen .Decrease-Key
művelet: minden él vizsgálatakor esetleg fut, tehát legfeljebb alkalommal, összesen .Ha Fibonacci-heap-et használunk, a Decrease-Key
művelet amortizáltan , így a teljes komplexitás .
6. Példa lépésenként Legyen az alábbi, súlyozott gráf:
2 3 A———B————C | \ | 4 1 5 | \ | D————E——F 6 7
Élek és súlyaik: (A,B)=2, (A,D)=4, (A,E)=1, (B,C)=3, (B,E)=5, (E,D)=6, (C,F)=5, (E,F)=7. Kiinduló csúcs: A.
key
közül a legkisebb E=1. Extract-Min → u=E.Vége: parent-tábla
parent = NIL parent = A parent = B parent = A parent = A parent = C
MST élei: (A,B), (B,C), (C,F), (A,D), (A,E). Súlyösszeg: 2+3+5+4+1 = 15.
7. Python-implementáció
import heapq
def prim(graph, start):
"""
graph: dict, kulcsok csúcsok, értékek list of (szomszéd, súly)
start: kiinduló csúcs
Visszatér: parent dict és MST élek listája
"""
parent = {start: None}
key = {v: float('inf') for v in graph}
key = 0
visited = set()
# (kulcsérték, csúcs)
heap =
mst_edges =
while heap:
k, u = heapq.heappop(heap)
if u in visited:
continue
visited.add(u)
# Ha nem a start, adjuk hozzá az MST élét
if parent is not None:
mst_edges.append((parent, u, k))
for v, w in graph:
if v not in visited and w < key:
key = w
parent = u
heapq.heappush(heap, (w, v))
return parent, mst_edges
# Példa használat
graph = {
'A': ,
'B': ,
'C': ,
'D': ,
'E': ,
'F':
}
parent, mst = prim(graph, 'A')
print("MST élek és súlyok:", mst)
8. Alkalmazások
9. Összefoglalás Prim algoritmusa egy egyszerű, de hatékony girbegurba módszer minimális feszítőfa felépítésére. Prioritásos halom segítségével idő alatt működik, és könnyen implementálható. Alkalmazása széles körű, a hálózattervezéstől kezdve a klaszterezésig számos területen hasznos.