22.4 Kruskalin algoritmi • • • Kruskalin algoritmia käytetään graafin minimaalisen virittävän puun (MVP) rakentamiseen. Syötteinä annetaan graafi G siihen kuuluvine pisteineen ja kaarineen (V, E) ja lisäksi kaarten väliset painot w. Tarkoituksena on muodostaa yhteys graafin kaikkien solmujen välille siten, että jokainen solmu on saavutettavissa tarkalleen yhtä reittiä kulkien mistä tahansa toisesta solmusta, ja solmuja toisiinsa yhdistettäessä pyritään valitsemaan aina tarjolla olevista lyhin yhteys. Alkuvaiheessa jokainen piste V määritellään omaksi erilliseksi joukokseen. Pisteitä yhdistävät kaaret lajitellaan puolestaan niiden painon mukaiseen ei-vähenevään suuruusjärjestykseen. Kaaret otetaan käsittelyyn mainitussa järjestyksessä, ja joka kerta, kun käsittelyvuorossa olevan kaaren luovan yhteyden johonkin graafin uuteen, toistaiseksi muualta saavuttamattomaan pisteeseen, kaari valitaan mukaan graafin minimaaliseen virittävään puuhun. Seuraavassa esitetään algoritmin pseudokoodi: • MVP-KRUSKAL(G, w) 1 A := ∅ /* Minimaaliseen virittävään puuhun kuuluvien kaarten joukko A alustetaan tyhjäksi. */ 2 FOR jokaiselle pisteelle v ∈ V[G] DO 3 Muodosta joukko, johon kuuluu yksinomaan piste v. 4 Lajittele graafin kaaret E painon mukaan ei-vähenevään järjestykseen. 5 FOR jokaiselle kaarelle (u, v) ∈ E edellä lajitellussa järjestyksessä DO 6 IF u ja v eivät kuulu keskenään samaan joukkoon /* Pisteiden u ja v välillä ei ole toistaiseksi ”tieyhteyttä”. */ 7 THEN A := A ∪ {(u, v)} 8 Muodosta unioni niille pistejoukoille, joihin u ja v kuuluvat. 9 RETURN A Algoritmi toimii ajassa Ο(E log2E), sillä kaaret joudutaan lajittelemaan (lisäoletus: V = Ο(E)). • • • • 22.4 Kruskalin algoritmi • Seuraavassa esitetään vielä esimerkki Kruskalin algoritmin toiminnasta: 8 b 4 c 2 a 9 4 e 14 7 h d i 11 8 7 6 1 10 g 2 f Ainoa kaari, jonka painona on 1, yhdistää pisteet g ja h. Valitaan aluksi kyseinen kaari, minkä jälkeen nuo pisteet kuuluvat keskenään samaan joukkoon. Seuraavaksi valitaan kahden mittaisista kaarista ci ja fg ensin mainittu, sillä oletetaan, että aakkosissa aikaisemmin oleva piste valitaan ensin. 8 7 b c d 4 9 2 4 e 11 14 i a 8 7 6 10 1 2 h g f 22.4 Kruskalin algoritmi • Vastaavalla tavalla jatketaan, ja lisätään seuraavaksi kaaret fg (paino 2), ab (4) ja cf (myös 4). Seuraavaksi tarjolla olevaa kaarta gi (6) ei lisätä, sillä pisteiden g ja i välillä on jo yhteys gfci. 8 7 b c d 4 9 2 4 e 11 14 i a 8 7 6 10 1 2 f g h Tämän jälkeen suoritus jatkuu seuraavasti: lisätään cd (7), ohitetaan hi (7), lisätään ah (8) ja ohitetaan bc (8). Tämän jälkeen tehdään viimeinen lisäys de, minkä jälkeen loput kolme kaarta eli järjestyksessä ef, bh ja df ohitetaan. Alemmassa kuvassa nähdään lopputilanne: 8 b 4 c 2 11 a 8 d 9 4 e 14 i 7 6 10 1 h 7 2 g f 22.5 Primin algoritmi • • • • • • Myös Primin algoritmia käytetään graafin minimaalisen virittävän puun (MVP) rakentamiseen. Syötteinä annetaan Kruskalin algoritmin tapaan graafi G siihen kuuluvine pisteineen ja kaarineen (V, E) ja lisäksi kaarten väliset painot w, mutta näiden lisäksi annetaan vielä lähtöpiste r. Algoritmissa voidaan valita mikä tahansa graafin G pisteistä lähtöpisteeksi. Aputietorakenteena Primin algoritmissa käytetään prioriteettijonoa, jonne asetetaan graafin pisteitä prioriteettiarvon mukaisessa ei-vähenevässä suuruusjärjestyksessä. Lähtöpisteestä edetään ensisijaisesti sinne, minne sieltä on lyhin etäisyys. Tietyllä hetkellä tarkasteltavana olevan pisteen vierekkäisyyslista käydään läpi, ja sen pisteet asetetaan prioriteettijonoon. Seuraavassa on nähtävissä Primin algoritmin pseudokoodi: MVP-PRIM(G, w, r) 1 Q := V[G] /* Aluksi kaikki graafin pisteet asetetaan prioriteettijonoon Q. */ 2 FOR jokaiselle pisteelle u ∈ Q DO 3 avain[u] := ∝ 4 avain[r] := 0 5 π[r] := NIL 6 WHILE Q ≠ ∅ DO 7 u := POISTA_MINIMI(Q) 8 FOR jokaiselle v ∈ VListat[u] DO 9 IF v ∈ Q AND w(u, v) < avain[v] 10 THEN π[v] := u 11 avain[v] := w(u, v) • • Algoritmi toimii ajassa Ο(E log2V), mikäli prioriteettijono Q toteutetaan käyttämällä minimikekoa. Käytettäessä Fibonacci-kekoa Q:n ylläpitämiseen päästään tätä parempaan suoritusaikaan, joka on suuruusluokkaa Ο(E + Vlog2V). 22.5 Primin algoritmi • Seuraavassa esitetään vielä esimerkki Primin algoritmin toiminnasta samalle graafille kuin Kruskalin algoritmille edellä. Lähtöpisteeksi valitaan a. 8 7 b c d 4 9 2 4 e 11 14 i a 8 7 6 10 1 2 h g f Prioriteettijonoon Q asetetaan aluksi a:n avainarvoksi 0 ja kaikille muille solmuille ∝. Siirrytään tutkimaan pistettä a ja poistetaan se Q:sta. Pisteiden b ja h avaimiksi päivittyvät 4 ja 8. Valitaan siten seuraavaksi piste b. Sen kautta saadaan c:lle uudeksi avainarvoksi 8. Jos minimi ei ole yksikäsitteinen (8), valitaan oletuksen mukaan aakkosissa aikaisempi (c). 8 7 b c d 4 9 2 4 e 11 14 i a 8 7 6 10 1 2 h g f 22.5 Primin algoritmi • Algoritmi jatkaa ahnasta etenemistään valitsemalla seuraavaksi aina sen prioriteettijonossa Q jäljellä olevista pisteistä sen, jonka avain on pienin (i/2, f/4, g/2, h/1, d/7 ja lopulta e/9). 8 7 b c d 4 9 2 4 e 11 14 i a 8 7 6 10 1 2 h g f Havaitaan, että edellä saavutettu lopputilanne ei ole täysin identtinen Kruskalin algoritmin valitseman kanssa, sillä Primin algoritmi valitsee heti toiseksi yhteyden bc, jotka eivät ole yhdistettyinä Kruskalin algoritmissa. Vastaavasti Kruskalin algoritmissa pisteeseen h edetään a:sta suoraan, kun sinne Primin algoritmin tuottamassa ratkaisussa kierrellään mutkitellen pisteiden b, c, f ja g kautta. Kannattaa lisäksi huomioida, että koska Primin algoritmi tallentaa aputietorakenteeseensa pisteitä eikä kaaria kuten Kruskal, ylläpidetään tietoja valituista poluista edeltäjälinkkien avulla aivan kuin leveys- ja syvyyshakupuissa edellä.
© Copyright 2024