Kruskal's algorithm

Üdvözlöm, Ön a Kruskal's algorithm szó jelentését keresi. A DICTIOUS-ban nem csak a Kruskal's algorithm szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a Kruskal's algorithm szót egyes és többes számban mondani. Minden, amit a Kruskal's algorithm szóról tudni kell, itt található. A Kruskal's algorithm szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. AKruskal's algorithm és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

Kruskal's algorithm (tsz. Kruskal's algorithms)

  1. (informatika) Kruskal-algoritmus

A Kruskal-algoritmus egy 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. Célja, hogy az összes csúcsot lefedje úgy, hogy a kiválasztott élek súlyösszege minimális legyen, miközben körök (ciklusok) létrejöttét elkerüli.



2. Az algoritmus ötlete

  1. Élsorrend kialakítása
    • Rendezzük az összes élt nemcsökkenő sorrendbe a súlyuk szerint.
  2. Élek felvétele
    • Sorban végigmegyünk a legkisebb súlyú éltől a nagyobbak felé, és minden élhez eldöntjük, hogy hozzáadható-e anélkül, hogy ciklust hozna létre.
  3. Cikluselkerülés
    • Használunk egy egyesítő–kereső (Union-Find vagy disjoint-set) adatszerkezetet, ami két műveletet támogat:
      • Find(u): megtalálja u komponensének „gyökér” képviselőjét.
      • Union(u, v): összefűzi (egyesíti) két komponens képviselőit.
    • Minden él vizsgálatakor ha Find(u) != Find(v), akkor az él nem zár ciklust ⇒ felvesszük az MST-be, és Union(u,v)-vel egyesítjük a komponenseket.

Az iteráció addig tart, míg az MST-ben él nem gyűlt össze (ahol a csúcsok száma).



3. Pseudokód

Kruskal(G, w):
    // G = (V, E) összefüggő, súlyozott, irányítatlan gráf
    T = ∅                         // az MST éleinek halmaza
    rendezd növekvően E-t w szerint
    inicializáld a disjoint-setet V elemekkel

    for minden (u, v) ∈ E, súly szerint:
        if Find(u) ≠ Find(v):
            T = T ∪ {(u, v)}
            Union(u, v)
        if |T| == |V| - 1:
            break

    return T

4. Idő- és helykomplexitás

  • Élsorrendezés: . Mivel általában nagyobb, ezt tekintjük dominánsnak.

  • Disjoint-set műveletek: Ha útösszevonással (union by rank) és útkompresszióval (path compression) valósítjuk meg, akkor egy Find vagy Union amortizált , ahol az inverz Ackermann-függvény (gyakorlatilag konstans). Összesen legfeljebb Find és Union hívás ⇒ .

  • Összesen:

  • Helyigény:

    • A disjoint-set tömbök: .
    • Az élsorrendezés és az MST tárolása: .



5. Példa Legyen a következő gráf élekkel és súlyokkal:

    1       4
A ——— B ——— C
| \     |
2  3    5
|     \ |
D ———— E
    6

Élek:

(A,B)=1, (A,D)=2, (A,E)=3, (B,C)=4, (B,E)=5, (D,E)=6
  1. Rendezés súly szerint:

  2. Disjoint-set inicializálás: minden csúcs külön komponens.

  3. Élek feldolgozása:

    • (A,B)=1: külön komponens ⇒ felvesszük, egyesítjük A és B.

    • (A,D)=2: A és D külön ⇒ felvesszük, egyesítjük.

    • (A,E)=3: A (és B, D) külön E-től ⇒ felvesszük, egyesítjük.

    • (B,C)=4: B (koalícióban A,D,E) külön C-től ⇒ felvesszük, egyesítjük.

    • Ezt követően már él gyűlt össze, MST kész:

    • Az élek (B,E) és (D,E) kimaradnak, mert egységkomponensekbe esnének.



6. Python-implementáció

class DisjointSet:
    def __init__(self, vertices):
        self.parent = {v: v for v in vertices}
        self.rank = {v: 0 for v in vertices}

    def find(self, v):
        if self.parent != v:
            self.parent = self.find(self.parent)
        return self.parent

    def union(self, u, v):
        ru, rv = self.find(u), self.find(v)
        if ru == rv:
            return
        # union by rank
        if self.rank < self.rank:
            self.parent = rv
        elif self.rank > self.rank:
            self.parent = ru
        else:
            self.parent = ru
            self.rank += 1

def kruskal(vertices, edges):
    """
    vertices: iterable csúcsok
    edges: lista 
    visszatér: lista az MST élekkel (u, v, w)
    """
    # 1. rendezés
    edges = sorted(edges, key=lambda x: x)
    ds = DisjointSet(vertices)
    mst = 

    # 2. élek hozzáadása
    for u, v, w in edges:
        if ds.find(u) != ds.find(v):
            ds.union(u, v)
            mst.append((u, v, w))
            if len(mst) == len(vertices) - 1:
                break
    return mst

# Példa használat
verts = 
eds = [
    ('A','B',1), ('A','D',2), ('A','E',3),
    ('B','C',4), ('B','E',5), ('D','E',6)
]
print("MST:", kruskal(verts, eds))

7. Alkalmazások

  • Hálózattervezés: telekommunikációs, elektromos hálózatok kiépítése minimális költséggel.
  • Klaszterelemzés: adatok csoportosítása feszítőfa alapján, például hierarchikus klaszterezésben.
  • Közlekedési hálózatok: út- vagy vasúthálózat tervezése.
  • Biológiai fák: filogenetikai fák költségalapú rajzolása.



8. Összefoglalás A Kruskal-algoritmus egyszerű, de hatékony girbegurba eljárás a minimális feszítőfa megtalálására. A kulcs a súly szerinti élsorrendezés és a disjoint-set adatszerkezet használata a ciklusok elkerüléséhez. időkomplexitása miatt széles körben alkalmazható mérsékelt és nagy méretű gráfokban.