Prims algoritm

Från Rilpedia

Hoppa till: navigering, sök
Wikipedia_letter_w.pngTexten från svenska WikipediaWikipedialogo_12pt.gif
rpsv.header.diskuteraikon2.gif

Prims algoritm är en girig algoritm för att skapa ett minimalt uppspännande träd från en godtycklig sammanhängande, viktad och oriktad graf.

Algoritmen finner i varje iteration den kant med lägst vikt som kan förbinda trädet med ett hörn som ännu inte finns med i trädet, varpå trädet utökas med denna kant (och det hörn som den ansluter till). Iterationen fortsätter så länge det finns hörn som inte lagts till i trädet.

Innehåll

Pseudokod

algoritm  PRIM
indata:   graf, en sammanhängande, viktad och oriktad graf
          rot,  ett hörn i graf
resultat: Varje hörn i graf märks med sin förälder i ett minimalt
          uppspännande träd av graf med det angivna hörnet som rot
          samt med vikten av kanten till föräldern.

för varje hörn i graf
    hörn.vikt     ← ∞
    hörn.förälder ← ogiltig

rot.vikt ← 0
 ← en prioritetskö bestående av alla hörn i graf,
     med minsta vikt som prioriteringsvärde

medan  inte är tom
    uextrahera_minsta(  )
    för varje hörn v som u ansluter till via en kant (u, v)
        om v finns i  och vikten av kanten (u, v) < v.vikt
            v.förälderu
            v.vikt ← vikten av kanten (u, v)

Exempel

Prim Algorithm 0.svg

Målet är att finna ett träd som omfattar hörnen A–G där trädets kanter har så låg sammanlagd kostnad som möjligt. Algoritmen börjar vid hörn A.

Prim Algorithm 1.svg

Hörn D har kostnad 5, vilket är lägre än hörn B:s 7, och därför läggs hörn D till trädet.

Prim Algorithm 2.svg

Hörn F ansluts, eftersom kostnaden för detta är 6, vilket är lägre än 7 (AB), 9 (DB) och 15 (DE).

Prim Algorithm 3.svg

Hörn B ansluts via A. Kanten BD kommer inte att ingå i trädet, eftersom B och D redan är förbundna indirekt.

Prim Algorithm 4.svg

E ansluts via B.

Prim Algorithm 5.svg

C ansluts via E.

Prim Algorithm 6.svg

G ansluts via E. Det finns inga fler hörn att ansluta. Trädet är fullständigt.

Tidskomplexitet

Prims algoritm har komplexitet O(E + V lg V), där E är antalet kanter och V är antalet hörn i den graf som trädet skapas från, under förutsättning att prioritetskön implementeras som en Fibonacciheap. (Om en binär heap används försämras komplexiteten till O(E lg V), vilket är asymptotiskt likvärdigt med Kruskals algoritm.)[1]

Se även

Referenser

  1. Cormen, T.H., Leiserson, E.L., Rivest, R.L., Stein, C: Introductions to Algorithms, MIT Press, USA 2001, 2 utgåvan, sid. 570–573. ISBN 0-262-03293-7. 
Personliga verktyg