811312A Tietorakenteet ja algoritmit 2015-2016 V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit
Sisältö 1. Johdanto 2. Leveyshaku 3. Syvyyshaku 4. Kruskalin algoritmi 5. Dijkstran algoritmi 811312A TRA, Verkot 2
V.4 Kruskalin algoritmi V.4.1 Minimivirittävät puut Puu on yhtenäinen suuntaamaton verkko, jolla ei ole syklejä Puussa kahden solmun välillä yksikäsitteinen polku Olkoon G = (V, E) yhtenäinen suuntaamaton verkko: Sen virittävä puu on mikä tahansa puu (V,T) missä aliverkko T E Verkon G = (V, E) virittävä puu saadaan valitsemalla joukosta E mahdollisimman vähän välejä niin että verkko säilyy yhtenäisenä Jos yhtenäisessä suuntaamattomassa verkossa on n solmua, niin sen virittävässä puussa on n-1 väliä 811312A TRA, Verkot 3
V.4.1 Minimivirittävät puut (2) Tässä osassa tarkastellaan yhtenäisiä suuntaamattomia painotettuja verkkoja Välin (u, v) painoarvoa merkitään w (u, v) painofunktio w E R (reaalilukujen joukko) Minimivirittävä puu eli pienin virittävä puu on sellainen virittävä puu, jossa painoarvojen summa on pienin mahdollinen virittäville puille 811312A TRA, Verkot 4
V.4.1 Minimivirittävät puut : Esimerkki Painotettu verkko: 3 2 3 1 2 2 5 a b c d e f 5 6 g Minimivirittävä puu: 2 a b c d 3 1 2 2 e f g 3 Yllä minimivirittävän puun paino on 13 811312A TRA, Verkot 5
V.4.2 Minimivirittävien puiden konstruointi Seuraavassa esitettävät algoritmit käyttävät ahnetta lähestymistapaa, kun ne määrittävät minimivirittävää puuta. Väliä (u, v) sanotaan turvalliseksi väliksi (safe edge), jos sen valinta joukkoon A säilyttää voimassa invariantin Ennen jokaisen uuden välin valintaa A on jonkun minimivirittävän puun välien joukon osajoukko. Algoritmi GENERIC-MST(G, w) on yleinen malli ahneille algoritmeille määrätä minimivirittävä puu 811312A TRA, Verkot 6
V.4.2 Minimivirittävien puiden konstruointi (2) Input: Yhtenäinen suuntaamaton verkko G, jolla on painofunktio w. Output: Verkon G minimivirittävä puu. GENERIC-MST(G, w) 1. A = 2. while A does not form a spanning tree 3. find an edge (u, v) that is safe for A 4. A = A {(u, v)} 5. return A 811312A TRA, Verkot 7
V.4.3 Kruskalin algoritmi Ahne ratkaisu, käyttää geneerisen algoritmin ideaa Apualgoritmit MAKE_SET(v) Muodostaa joukon, jonka ainoa alkio on verkon solmu v FIND_SET(u) Etsii muodostettujen joukkojen parista joukon, joka sisältää alkion u UNION(u, v) Muodostaa unionin alkion u sisältävästä joukosta ja alkion v sisältävästä joukosta 811312A TRA, Verkot 8
V.4.3 Kruskalin algoritmi (2) Input: Yhtenäinen suuntaamaton verkko G, jolla on painofunktio w. Solmujen joukko G.V ja välien G.E Output: Verkon G minimivirittävä puu. MST_KRUSKAL(G, w) 1. A = 2. for each vertex v G.V 3. MAKE_SET(v) 4. sort the edges of G.E into nondecreasing order by weight 5. for each edge (u, v) G.E taken in nondecreasing order by weight 6. if FIND_SET(u) FIND_SET(v) 7. A = A {(u, v)} 8. UNION(u, v) 9. return A 811312A TRA, Verkot 9
V.4.3 Kruskalin algoritmi : Esimerkki G: 3 2 3 1 2 2 5 a b c d e f 5 6 g A = Joukot {a},{b},{c},{d},{e}, {f},{g} Välit järjestyksessä (a,e),(a,b),(b,f),(c,g),(c,f),(c,d), (d,g),(e,f),(f,g) 1. A = {(a,e)}, Joukot {a,e},{b},{c},{d},{f},{g} 2. A = {(a,e),(a,b)} Joukot {a,b,e},{c},{d},{f},{g} 3. A = {(a,e),(a,b),(b,f)} Joukot {a,b,e,f},{c},{d}, {g} 4. A = {(a,e),(a,b),(b,f),(c,g)} Joukot {a,b,e,f},{c,g},{d} 5. A = {(a,e),(a,b),(b,f),(c,g),(c,f)} Joukot {a,b,c,e,f,g},{d} 6. A= {(a,e),(a,b),(b,f),(c,g),(c,f),(c,d)} Joukot {a,b,c,d,e,f,g} T: 1 a b c d e 2 2 f 3 g 2 3 811312A TRA, Verkot 10
V.4.4 Kruskalin algoritmin oikeellisuus Algoritmin päättyminen on selvää, koska se käy läpi äärellisen välijoukon Kun algoritmissa FIND_SET(u) FIND_SET(v), niin (u,v) on väli joka yhdistää kahta erillistä puuta, jotka ovat muodostuneet siihen asti algoritmissa Voidaan osoittaa, että väli (u,v) on tällöin turvallinen Tästä puolestaan seuraa, että lopulta muodostuu minimivirittävä puu 811312A TRA, Verkot 11
V.4.5 Kruskalin algoritmin aikakompleksisuus Oletetaan, että verkossa solmuja N ja välejä M HUOM! M N-1, koska verkko on yhtenäinen Rivin 2 joukkojen muodostaminen vie ajan O(N) Välien lajittelu vie ajan O(Mlg(M)) Loppu riippuu apualgoritmien toteutuksesta, silmukassa suoritetaan FIND_SET korkeintaan 2*M kertaa ja UNION korkeintaan N kertaa Tehokkaasti toteutettuna luokkaa O((N+M)α(N)) missä α on logaritmia hitaammin kasvava funktio Kaikkiaan saadaan kompleksisuusluokaksi O(Mlg(M)) tai O(Mlg(N)) Koska lg(m) lg(n 2 ) = 2*lg(N) 811312A TRA, Verkot 12
V.5 Dijkstran algoritmi V.5.1 Lyhimmistä poluista verkossa Leveyshakualgoritmi määrittää verkon lyhimmät polut, jos verkon väleillä ei ole painoarvoja Tällöin muodostuvaa edeltäjätaulukkoa hyväksi käyttäen voidaan muodostaa verkko G = (V, E ), ns. edeltäjäaliverkko (predecessor subgraph) siten, että sen solmujen joukko V = {v V [v] NIL} {s} ja välien joukko E = { ( [v], v) E v V {s} }. Tämä verkko on puu, jossa on yksikäsitteinen polku solmusta s jokaiseen muuhun saavutettavaan solmuun. Polut ovat lyhimmät polut verkossa G 811312A TRA, Verkot 13
V.5.2 Dijkstran algoritmi: Johdanto Keksijä: Edsger Dijkstra 1956 Julkaistu 1959 Tuottaa painotetussa verkossa lyhimmät (pienipainoisimmat, pienimmän kustannuksen) polut yhdestä solmusta Sukua leveyshaulle Toimii suunnatulle verkolle, jossa ei ole negatiivisia painoarvoja Sovelletaan laajasti karttapalveluissa, reitittämisongelmissa jne. 811312A TRA, Verkot 14
V.5.3 Dijkstran algoritmi Merkintöjä: V verkon solmut, S valittujen solmujen joukko, Q minimiprioriteettijono, jossa aluksi verkon kaikki solmut Joukon S solmuille lyhimmän polun etäisyys on laskettu valmiiksi Silmukassa Q = V S, järjestetty toistaiseksi lähtösolmusta saatujen lyhimpien etäisyyksien mukaan EXTRACT_MIN poistaa joukosta pienimmän alkion ja palauttaa sen 811312A TRA, Verkot 15
V.5.3 Dijkstran algoritmi (2) Input: Suunnattu verkko G, ei-negatiivisia arvoja saava painoarvofunktio w ja solmu s. Output: Taulukossa d vaaditut lyhimpien polkujen pituudet solmusta s ja taulukossa solmujen edeltäjäsolmut. DIJKSTRA(G, w, s) 1. for each v in G.V 2. d[v] = 3. [v] = NIL 4. d[s] = 0 5. S = 6. Q = G.V 7. while Q 8. u = EXTRACT_MIN(Q) 9. S = S {u} 10. for each v in G.Adj[u] 11. if d[v] > d[u]+w(u,v) 12. d[v] = d[u]+w(u,v) 13. [v] = u 811312A TRA, Verkot 16
V.5.3 Dijkstran algoritmi : Esimerkki Lähde: Cormen et. al: Introduction to Algorithms. MIT Press (2001). Figure 24.6 811312A TRA, Verkot 17
V.5.4 Dijkstran algoritmin oikeellisuus On selvää, että algoritmi päättyy, koska joukko Q pienenee jokaisella silmukan suorituskerralla Merkitään (s, u) = solmun u lyhin etäisyys solmusta s Riittää osoittaa, että jokaiselle saavutetulle solmulle u pätee d[u] = (s, u), kun se liitetään joukkoon S. Jos solmulle u päivitetty d[u] = (s, u), d[u] ei voi enää muuttua 811312A TRA, Verkot 18
V.5.4 Dijkstran algoritmin oikeellisuus (2) Todistuksen idea: Olkoon u ensimmäinen joukkoon S lisättävä solmu, jolle d[u] (s, u) Tarkastellaan lyhintä polkua solmusta s solmuun u: s x y u, missä solmu y on polulla ensimmäinen solmu joka ei kuulu joukkoon S, kun u valitaan joukkoon S Siis d[x] = (s, x) Kun x lisätään S:ään d[y] = (s,x)+w(x,y) = (s, y) Kun u valitaan joukkoon s, on d[u] <= d[y], siis d[y] = (s, y) = (s, u) = d[u], ristiriidassa alkuperäisen oletuksen kanssa 811312A TRA, Verkot 19
V.5.5 Dijkstran algoritmin kompleksisuus Olkoon verkossa N solmua ja M väliä Rivien 1-6 kompleksisuus luokkaa Ɵ(N) while-silmukkaa suoritetaan N kertaa Rivit 10-13 suoritetaan kerran jokaiselle välille Kompleksisuus riippuu jonon Q toteutuksesta Jos järjestämätön jono, josta haetaan minimi jokaisella kierroksella, operaatioita N+(N-1)+ +1 luokkaa Ɵ(N 2 ) Algoritmi luokkaa Ɵ(N 2 ) Jos käytetään minimikekoa, luokkaa O((M+N)lg(N)) Algoritmi luokkaa O((M+N)lg(N)) 811312A TRA, Verkot 20