811312A Tietorakenteet ja algoritmit 2016-2017 V Verkkojen algoritmeja Osa1 : Leveys- ja syvyyshaku
Sisältö 1. Johdanto 2. Leveyshaku 3. Syvyyshaku 4. Kruskalin algoritmi 5. Dijkstran algoritmi 811312A TRA Verkot / osa 1 2
V.1 Johdanto Verkkoalgoritmit ovat yleisimpiä ja tärkeimpiä algoritmityyppejä tunnetaan suuri määrä erilaisia algoritmeja verkkoalgoritmeja on analysoitu laajasti. Yleisneuvo algoritmiseen ongelmaan: muunna verkkojen ongelmaksi ratkaisu saattaa olla yleisesti tunnettu tai ongelma osoitettu vaikeaksi. 811312A TRA Verkot / osa 1 3
V.1.1 Verkon määritelmä Verkko (graafi, graph) on pari G = (V, E), missä V on solmujen (vertices) epätyhjä joukko E on välien (edges) joukko E V V (relaatio solmujen joukossa) E määrittelee, mitkä solmut on kytketty toisiinsa. Verkko voi olla suunnattu tai suuntaamaton: Suuntaamattomassa verkossa ehdosta i, j E seuraa aina j, i E. Verkko voi olla painotettu: väleihin liitetään luku, ns. painoarvo 811312A TRA Verkot / osa 1 4
V.1.2 Esimerkki 1 1 2 2 5 3 5 3 4 4 Suunnattu verkko Suuntaamaton verkko 811312A TRA Verkot / osa 1 5
V.1.2 Esimerkki (2) Kuvion esittämille verkoille solmujen joukko V = { 1, 2, 3, 4, 5 }. välien joukko suunnatulle verkolle E = {(1,2),(2,4),(2,5),(3,2),(3,5),(4,3),(5,4)} välien joukko suuntaamattomalle verkolle E = {(1,2),(2,1),(2,4),(4,2),(2,5),(5,2),(3,2),(2,3),(3,5), (5,3),(4,3),(3,4),(5,4),(4,5)} Suunnatuille väleille käytetään joskus kulmasulkeita ja silloin kaarisulut varataan suuntaamattomille (kaksisuuntaisille) väleille 811312A TRA Verkot / osa 1 6
V.1.3 Verkkojen esittäminen Verkko: 1 Matriisesitys: 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 2 Adj 5 3 1 2 2 / 4 5 / 4 3 2 5 / 4 3 / Vieruslistaesitys: 5 4 /
V.2 Leveyshaku (Breadth-first search) Yksinkertaisimpia algoritmeja verkon läpikäymiseen Toimii monien algoritmien pohjaratkaisuna Idea: Valitaan kiinteä solmu s ja käydään välejä systemaattisesti läpi, kunnes kohdataan kaikki solmut, joihin solmusta s voidaan päästä. Ensin löydetään kaikki etäisyydellä 1 olevat solmut, sitten etäisyydellä 2 olevat solmut jne. -> Nimitys leveyshaku 811312A TRA Verkot / osa 1 8
V.2 Leveyshaku (2) Käyttää (FIFO-tyyppistä) jonoa Q Operaatiot ENQUEUE ja DEQUEUE Taulukko color: Solmujen värit kussakin vaiheessa Valkoinen: Solmua ei vielä löydetty Musta: Solmu ja sen kaikki naapurit löydetty Harmaa: Solmu löydetty mutta sillä voi olla valkeita naapureita Taulukko d: Solmujen etäisyydet lähtösolmusta Taulukko p: Solmujen edeltäjät lyhimmässä polussa Lopuksi voidaan lukea lyhin polku mihin tahansa solmuun (lopusta alkuun) 811312A TRA Verkot / osa 1 9
V.2.1 Leveyshaun algoritmi Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään vieruslistaesitystä. Tulostus: N solmujen lukumäärä. N-paikkaiset taulukot p,d ja color indeksoidaan verkon solmuilla. Taulukkoon d lasketaan solmun etäisyys syötesolmusta s. Arvo INF = ei polkua. Taulukkoon p lasketaan solmun edeltäjäsolmu jossakin lyhimmässä polussa syötesolmusta s. Arvo NIL = ei polkua. BFS(G,s) 1. for each u in V 2. color[u] = WHITE 3. d[u] = INF 4. p[u] = NIL 5. d[s] = 0 6. color[s] = GRAY 7. Q = EMPTY 8. ENQUEUE(Q,s) 9. while Q!= EMPTY 10. u = DEQUEUE(Q) 11. for each v in Adj[u] 12. if color[v] == WHITE 13. color[v] = GRAY 14. d[v] = d[u]+1 15. p[v] = u 16. ENQUEUE(Q,v) 17. color[u] = BLACK 18. return 811312A TRA Verkot / osa 1 10
V.2.2 Esimerkki: Leveyshaun eteneminen 1: 2: a b c d INF 0 INF INF a b c d 1 0 INF INF INF INF INF e f g INF 1 INF Q:b Q:a, f 0 e f g 1 1 3: a b c d 4: 1 0 INF INF a b c d 1 0 2 INF INF 1 INF e f g Q: f 1 2 1 2 e f g Q:e, c, g 2 2 2 811312A TRA Verkot / osa 1 11
V.2.2 Esimerkki: Leveyshaun eteneminen (2) 5: a b c d 6: 1 0 2 INF a b c d 1 0 2 3 2 1 2 e f g Q:c, g 2 2 2 1 2 e f g Q:g, d 2 3 7: 8: a b c d a b c d 1 0 2 3 1 0 2 3 2 1 2 e f g Q:d 3 2 1 2 e f g Q: 811312A TRA Verkot / osa 1 12
V.2.3 Leveyshaun algoritmin analyysi: kompleksisuus Oletetaan, että verkossa N solmua ja M väliä Tarkka askelten määrä riippuu verkon rakenteesta Yläraja suoritettavien rivien määrälle 6 (N+M) Siis algoritmin kompleksisuusluokka O(N+M) HUOM! Jos verkossa lähes kaikkien solmujen välillä on kytkentä, on M luokkaa N 2. Tällöin siis algoritmin kompleksisuus on luokkaa O(N 2 ). 811312A TRA Verkot / osa 1 13
V.2.3 Leveyshaun algoritmin analyysi: oikeellisuus Olkoon algoritmin syötesolmu s Merkintä: (s,v) on solmun v etäisyys solmusta s Algoritmi todettu oikeaksi, kun osoitetaan: 1. Algoritmin suorituksen jälkeen kaikki solmusta s saavutettavat solmut löydetään 2. Taulukon d arvo d[v] = (s,v) 3. Jos v s, ja v voidaan saavuttaa solmusta s, niin jokin lyhimmistä poluista solmusta s solmuun v on polku solmusta s solmuun p[v] ja väli (p[v],v) 811312A TRA Verkot / osa 1 14
V.2.4 Leveyshaun sovelluksia Lyhimmän polun hakeminen kahden solmun väliltä Verkon yhtenäisyyden selvittäminen Yhdistettyjen komponenttien hakeminen 811312A TRA Verkot / osa 1 15
V.2.4.1 Lyhimmän polun tulostaminen Syöte: Verkko G=(V,E) ja sen solmut s ja v. Algoritmissa oletetaan ensin ajettavan BFS(G,s), jonka tuottamaa taulukkoa p käytetään. Tulostus: Lyhin polku solmusta s solmuun v tai ilmoitus siitä, että polkua ei ole. BFS_POLKU(G,s,v) 1. if v==s 2. tulosta s 3. else 4. if p[v] == NIL 5. tulosta Ei polkua 6. else 7. BFS_POLKU(G,s,p[v]) 8. tulosta v 9. return 811312A TRA Verkot / osa 1 16
V.3 Syvyyshaku Monipuolisempi kuin leveyshaku Laajempi sovellettavuus Hieman haastavampi käyttää Idea: Mennään verkossa aina aluksi niin syvälle kuin päästään, ts. tarkistetaan, onko tutkittavalla solmulla s vielä tutkimattomia siitä lähteviä välejä Kun kaikki välit on tutkittu, algoritmi perääntyy solmuun, josta solmu s löydettiin ja tutkii siitä lähtevät välit Jatketaan, kunnes lähtösolmusta saavutettavat solmut on kaikki tutkittu Jos vielä tutkimattomia solmuja, valitaan uusi lähtösolmu 811312A TRA Verkot / osa 1 17
V.3 Syvyyshaku (2) Toteutuksesta: Käytetään samankaltaista solmujen värittämistä ja edeltäjätaulukkoa kuin leveyshaussa Lisäksi globaali askelmuuttuja, joka ilmaisee kunkin solmun löytämis- ja tarkastelun lopettamisajan Tallennetaan aikaleimoina kahteen taulukkoon Aikaleimojen avulla saadaan verkon rakenteesta tarkempaa tietoa kuin leveyshaulla 811312A TRA Verkot / osa 1 18
V.3.1 Syvyyshaun algoritmi Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään vieruslistaesitystä. Tulostus: Olkoon N solmujen lukumäärä. N-paikkaiset taulukot p,d,f ja color indeksoidaan verkon solmuilla. Taulukkoon p lasketaan solmun edeltäjäsolmu syvyyshakupuussa. Taulukkoon d lasketaan solmun havaitsemisaika ja taulukkoon f solmun käsittelyn lopetusaika. DFS(G) 1.for each u in V 2. color[u] = WHITE 3. p[u] = NIL 4. time = 0 5.for each u in V 6. if color[u]==white 7. DFS_VISIT(u) 8.return DFS_VISIT(u) 1. color[u] = GRAY 2. time = time+1 3. d[u] = time 4. for each v in Adj[u] 5. if color[v]==white 6. p[v] = u 7. DFS_VISIT(v) 8. color[u] = BLACK 9. time = time+1 10.f[u] = time 11.return 811312A TRA Verkot / osa 1 19
V.3.2 Syvyyshaun eteneminen 1: a b c 2: 1/ a b c 1/ 2/ d e f d e f 3: a b c 4: a b c 1/ 2/ 1/ 2/ 3/ d e f B 4/ 3/ d e f 811312A TRA Verkot / osa 1 20
V.3.2 Syvyyshaun eteneminen (2) 5: a b c 6: a b c 1/ 2/ 1/ 2/ B 4/5 3/ d e f B 4/5 3/6 d e f 7: a b c 8: a b c 1/ 2/7 1/8 2/7 B F B 4/5 3/6 d e f 4/5 3/6 d e f 811312A TRA Verkot / osa 1 21
V.3.2 Syvyyshaun eteneminen (3) 9: a b c 10: a b c 1/8 2/7 9/ 1/8 2/7 9/ F B F B C 4/5 3/6 d e f 4/5 3/6 10/ d e f 11: a b c 1/8 2/7 9/ F B C 4/5 3/6 10/11 d e f 12: a b c 1/8 2/7 9/12 F B C 4/5 3/6 10/11 d e f 811312A TRA Verkot / osa 1 22
V.3.3 Syvyyshaun kompleksisuus Oletetaan, että verkossa N solmua ja M väliä Algoritmi DFS_VISIT suoritetaan täsmälleen kerran jokaiselle solmulle Jokainen solmusta lähtevä väli tutkitaan DFS_VISITissä vakioaikaisella operaatiolla sekä mahdollisella DFS_VISIT-kutsulla Siis kompleksisuus Θ(N+M) 811312A TRA Verkot / osa 1 23
V.3.4 Syvyyshaun ominaisuuksia Edeltäjätaulukossa p[u] = v, jos ja vain jos (u,v) on verkon väli ja v havaitaan siinä vaiheessa, kun u on väriltään harmaa Muodostetaan verkko, jonka välit ovat (p[u],u) solmuille u joilla on edeltäjä Saadaan puiden muodostama verkko = syvyyssuuntainen virittävä metsä (depth-first forest) Jos solmu v samassa puussa solmun u kanssa ja solmusta u lähtevässä alipuussa, sanotaan, että u on solmun v edeltäjä ja v solmun u jälkeläinen Solmu u solmun v edeltäjä tarkalleen silloin, kun u on väriltään harmaa havaittaessa solmu v 811312A TRA Verkot / osa 1 24
V.3.4 Syvyyshaun ominaisuuksia (2) Esimerkkiverkon syvyysuuntainen virittävä metsä a c b f e d 811312A TRA Verkot / osa 1 25
V.3.4 Syvyyshaun ominaisuuksia (3) Olkoot u ja v verkon G solmuja ja suoritetaan verkolle syvyyshaku. Silloin jokin seuraavasta kolmesta ehdosta on voimassa: 1. Välit [d[u],f[u]] ja [d[v],f[v]] ovat erilliset eikä u ole solmun v jälkeläinen eikä v solmun u jälkeläinen 2. Väli [d[u],f[u]] sisältyy kokonaisuudessaan väliin [d[v],f[v]] ja u on solmun v jälkeläinen 3. Väli [d[v],f[v]] sisältyy kokonaisuudessaan väliin [d[u],f[u]] ja v on solmun u jälkeläinen Seuraus: Solmu v on solmun u jälkeläinen jos ja vain jos d[u] < d[v] < f[v] < f[u] 811312A TRA Verkot / osa 1 26
V.3.4 Syvyyshaun ominaisuuksia (4) Solmujen käsittelyajat esimerkkiverkossa a c b f e d 1 2 3 4 5 6 7 8 9 10 11 12 811312A TRA Verkot / osa 1 27
V.3.4 Syvyyshaun ominaisuuksia (5) Verkon välit jaetaan seuraaviin luokkiin: 1. Puuvälit (tree edges) ovat välejä syvyysmetsän puissa Siten (u,v) on puuväli, jos solmu v havaittiin väliä (u,v) tutkimalla 2. Takautuvat välit (back edges) välejä (u,v), joissa u on solmun v jälkeläinen jossakin syvyysmetsän puussa 3. Etenevät välit (forward edges) välejä (u,v), joissa u on solmun v edeltäjä jossakin syvyysmetsän puussa, ja (u,v) ei ole puuväli 4. Sivuttaisvälit (cross edges) ovat välejä, jotka eivät kuulu mihinkään luokista 1-3 811312A TRA Verkot / osa 1 28
V.3.4 Syvyyshaun ominaisuuksia (6) Välien luokittelu esimerkkiverkossa a b c 1/8 2/7 9/12 Puuväli F B C F Etenevä väli 4/5 3/6 d e f 10/11 B C Takautuva väli Sivuttaisväli 811312A TRA Verkot / osa 1 29
V.3.5 Syklin havaiseminen syvyyshaulla Verkossa sykli tarkalleen silloin, kun syvyyshaku tuottaa vähintään yhden takautuvan välin Väli (u,v) on takautuva, jos u on solmun v jälkeläinen Tällöin väliä ensimmäistä kertaa tutkittaessa solmun v on oltava harmaa, jolloin v on solmun u edeltäjä Takautuva väli voidaan havaita algoritmin suoritusvaiheessa -> Saadaan versio, joka havaitsee syklin 811312A TRA Verkot / osa 1 30
V.3.5 Syklin havaiseminen syvyyshaulla (2) Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään vieruslistaesitystä. Tulostus: Kuten syvyyshaku, mutta palauttaa arvon TRUE, jos verkossa sykli ja arvon FALSE muuten DFS(G) 1.for each u in V 2. color[u] = WHITE 3. p[u] = NIL 4. time = 0 5. cycle = FALSE 6.for each u in V 7. if color[u]==white 8. DFS_VISIT(u) 9.return cycle DFS_VISIT(u) 1. color[u] = GRAY 2. time = time+1 3. d[u] = time 4. for each v in Adj[u] 5. if color[v]==gray 6. cycle=true 8. if color[v]==white 9. p[v] = u 10. DFS_VISIT(v) 13. color[u] = BLACK 14. time = time+1 15. f[u] = time 16. return 811312A TRA Verkot / osa 1 31
V.3.6 Vahvasti yhtenäiset komponentit Vahvasti yhtenäinen komponentti suunnatussa verkossa on sellainen maksimaalinen solmujen joukko, että aina kun u ja v ovat joukon solmuja, on olemassa polku sekä solmusta u solmuun v että solmusta v solmuun u Esimerkkiverkossa vahvasti yhtenäiset komponentit ovat {a}, {b,d,e}, {c} ja {f} Voidaan löytää syvyyshaulla Merkintä: kun G on verkko, niin G T on verkko joka saadaan G:stä kääntämällä välien suunnat Voidaan tehdä ajassa O(N+M), jos G:ssä M väliä 811312A TRA Verkot / osa 1 32
V.3.6 Vahvasti yhtenäiset komponentit (2) Syöte: Suunnattu verkko G=(V,E). Verkolle oletetaan käytettävän vieruslistaesitystä. Tulostus: Syöteverkon vahvasti yhtenäiset komponentit. SCC(G) 1. Suorita DFS(G), käytetään solmujen käsittelyajan päättymistaulukkoa f. 2. Muodosta G T 3. Suorita DFS(G T ), mutta pääsilmukassa (rivi 6) käsitellään solmut askelessa 1 saatujen f[u]:n arvojen suhteen vähenevässä järjestyksessä. 4. Askelessa 3 syntyvän virittävän metsän jokainen puu on verkon G vahvasti yhtenäinen komponentti. 811312A TRA Verkot / osa 1 33
V.3.6 Vahvasti yhtenäiset komponentit (3) Analyysi. Verkko G, jossa N solmua ja M väliä Kompleksisuus: Kahdesti syvyyshaku (Θ(N+M)) G T :n muodostaminen (Θ(N+M)) Koko algoritmin kompleksisuus Θ(N+M) 811312A TRA Verkot / osa 1 34
V.3.6 Vahvasti yhtenäiset komponentit (4) Oikeellisuus: 1. Jos solmut u ja v samassa komponentissa, G:ssä polku u:sta v:hen ja päinvastoin. Samoin G T :ssä. u ja v päätyvät samaan puuhun 2. Olkoot u ja v samassa puussa, jonka juuri on x Siis G T :ssä polut x->u ja x->v, joten G:ssä on polut u->x ja v->x Syvyyshakujärjestys G T :lle takaa myös G:ssä polut x->u ja x->v Siten u ja v samassa komponentissa Kohdat 1 ja 2 osoittavat algoritmin oikeaksi 811312A TRA Verkot / osa 1 35
V.3.7 Syvyyshaku suuntaamattomassa verkossa Toimii samaan tapaan kuin suunnatuissa verkoissa Välien luokittelua tulkittava Suuntaamattomassa verkossa väli (u,v) ja (v,u) samaistetaan Välin luokaksi annetaan se, joka tehdään, kun väliä tarkastellaan ensimmäistä kertaa, olipa kyseessä vali (u,v) tai (v,u) Suuntaamattoman verkon välit kaikki joko puuvälejä tai takautuvia välejä Syvyyssuuntaisen virittävän metsän puut antavat verkon yhtenäiset komponentit 811312A TRA Verkot / osa 1 36