22.4 Kruskalin algoritmi

Transcription

22.4 Kruskalin algoritmi
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ä.