Tietorakenteet ja algoritmit Verkot Ari Korhonen 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 1 10. VERKOT ( graphs ) § § § § § § § § § § 10.1 Yleistä 10.2 Terminologiaa 10.3 Verkon esittäminen 10.4 Verkon läpikäyntialgoritmit (graph traversal) 10.5 Painotetut verkot (weighted graphs) 10.6 Pienin virityspuu (minimun spanning tree) 10.7 Lyhin reitti (shortest path) 10.8 Verkon yhtenäisyys (graph connectivity) 10.9 Suunnatut verkot 10.10* Joukot ja verkot 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 2 10.1 Yleistä § Verkko on kokoelma solmuja (vertex), joita yhdistää toisiinsa joukko särmiä (edge). Särmiä kutsutaan myös kaariksi (arc). § Solmuilla on nimi ja niihin voi liittyä dataa A B C D 17. ja 24.11.2015 E Tietorakenteet ja algoritmit - syksy 2015 3 § Särmät yksilöidään niiden päätesolmujen avulla. Särmiin voi liittyä paino (weight) § Verkon määrittely ei riipu siitä, miten se on esitetty tai piirretty. Usein maantieteellinen esitys on selkein § Verkkojen ja verkkoalgoritmien sovelluksia: • Lentoyhtiön aikataulu • Maantieverkko • Projektin aikataulu • Putkistokaavio • Virtapiiri • Tietoliikenneverkko • 3D malli kappaleesta 17. ja 24.11.2015 A B C D Tietorakenteet ja algoritmit - syksy 2015 E 4 Eräitä verkkoihin liittyviä ongelmia: § Onko reittiä pisteestä A pisteeseen B? § Mikä on lyhin reitti pisteestä A pisteeseen B, kun lasketaan särmät? § Mikä on halvin reitti pisteestä A pisteeseen B, kun lasketaan särmiin liittyvät kustannukset? § Mikä on pienin kustannus, jolla verkon eri solmut voidaan yhdistää toisiinsa? § Voidaanko verkko levittää tasoon? 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 5 10.2 Terminologiaa § § § § § Polku (path) Yksinkertainen polku (simple path) Silmukka (cycle) suunnattu verkko (directed graph, network) suuntaamaton verkko (undirected graph) • yhtenäinen (connected) § painotettu verkko (weighted graph) § Verkon erikoistapauksia (puut, metsä, täydellinen) • virityspuu (spanning tree) • täydellinen (complete) § Vahvasti yhtenäiset komponentit (strongly connected components) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 6 10.2 Terminologiaa Solmujen väliset yhteydet: § Polku (path) on solmujen lista, joka johtaa solmusta x solmuun y, siten että listan peräkkäisten solmujen välillä on särmä § Yksinkertainen polku (simple path) ei kulje saman solmun kautta kahdesti § Silmukka (cycle) on yksinkertainen polku, paitsi että sen alku- ja loppusolmut ovat samat 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 7 § Jos verkon särmiä voi edetä vain tiettyyn suuntaan, kyseessä on suunnattu verkko (directed graph, network). Muutoin verkko on suuntaamaton (undirected) Esimerkki: Projektin aikataulu. Mikä vaihe seuraa mitäkin? § Jos verkon särmiin liittyy jokin kustannus, on kyseessä painotettu verkko (weighted graph) Esimerkki: Maantieverkko + etäisyydet 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 8 Verkon yhtenevyys: § Suuntaamaton verkko on yhtenäinen (connected), jos jokaisesta solmusta on polku kaikkiin muihin solmuihin § Epäyhtenäinen verkko koostuu yhtenäisistä osaverkoista Esimerkki: Suomen maantieverkko on epäyhtenäinen, koska tietä pitkin ei pääse kaikkiin kaupunkeihin, esim. Maarianhaminaan. Välissä tarvitaan muunlaisia yhteyksiä. 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 9 Puut: § Puu (tree) on yhtenäinen suuntaamaton verkko, jossa ei ole silmukoita ⇒ Puussa kahden solmun välillä on vain yksi (yksinkertainen) polku ⇒ Jos puuhun lisätään särmä muodostuu silmukka § Metsä (forest) on epäyhtenäinen verkko, jonka yhtenäiset osat ovat puita 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 10 § Virityspuu (spanning tree) on verkon yhtenäinen aliverkko, joka sisältää kaikki verkon solmut, mutta vain niin paljon särmiä kuin tarvitaan muodostamaan niistä puu Esimerkki 1: Pienin määrä johtoa, mikä tarvitaan yhdistämään tietty joukko kytkentäpisteitä Esimerkki 2: Lyhimmät reitit annetusta lähtöpisteestä kaikkiin muihin verkon solmuihin. § Virityspuu ei ole yksikäsitteinen 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 11 Verkon G=(V,E), jossa on |V| solmua, särmien E ⊆ V × V määrä: § Puu, jossa on |V| solmua, sisältää |E| = |V| - 1 särmää § Suuntaamattomassa verkossa, jossa on |V| solmua, särmien määrä |E| voi olla: 0 ≤ |E| ≤ |V|(|V|-1)/2 § Usein itseisarvomerkit (||) jätetään pois, E = O(V2) § Verkko, jossa on kaikki mahdolliset särmät, on täydellinen (complete) § Verkkoa voidaan sanoa tiheäksi (dense) tai harvaksi (sparse). Rajakynnyksenä esimerkiksi V log V särmää. 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 12 Kysymyksiä § Mikä on maksimimäärä kaaria suuntaamattomassa verkossa, jossa on 4 solmua? § Jos yhtenäisen verkon virityspuussa on 10 kaarta, niin kuinka monta solmua virityspuussa on? § Mikä on minimimäärä solmuja suuntaamattomassa verkossa, jossa on sykli? 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 13 10.3 Verkon esittäminen Verkko voidaan esittää tietorakenteena usealla eri tavalla: 1) Yhteysmatriisi (adjacency matrix) § Oletetaan, että verkon solmut kuvataan kokonaislukuina 1..V § Esimerkkiverkko voidaan esittää nyt matriisimuodossa, jossa alkio 1 kuvaa särmän olemassaoloa ja alkio 0, että särmää ei ole. A B C 17. ja 24.11.2015 A B C Tietorakenteet ja algoritmit - syksy 2015 A 1 0 1 B 0 1 1 C 1 1 1 14 § Sovitaan, että alkiosta on yhteys itseensä § Suuntaamattoman verkon matriisissa puolet alkioista on tarpeettomia, mutta neliömatriisia on helpompi käsitellä algoritmisesti kuin kolmiomatriisia. § Suunnatussa verkossa matriisi ei ole symmetrinen § Yhteysmatriisi soveltuu tiheille verkoille A B C 17. ja 24.11.2015 A B C Tietorakenteet ja algoritmit - syksy 2015 A 1 0 1 B 0 1 1 C 1 1 1 15 2) Seuraajaluettelo (adjacency structure/list) § Jokaisen solmun vieruslistassa eli seuraajaluettelossa luetellaan kaikki ne solmut, joihin on särmä tästä solmusta § Esimerkkiverkon vieruslista: A B A: C B: C C: A, B C § Toteutettavissa tehokkaasti linkitettyinä listoina 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 16 A B D C E F H 17. ja 24.11.2015 G A: F, C, B, G B: A C: A D: F, E E: G,F, D F: A, E, D G: E, A H: I I: H I Tietorakenteet ja algoritmit - syksy 2015 17 10.4 Verkon läpikäyntialgoritmit (graph traversal) § Algoritmien tavoitteena on käydä läpi verkon kaikki solmut § Tätä varten verkon ajatellaan koostuvan kolmesta osasta: 1) Virityspuu (spanning tree) • Solmut, joissa on jo käyty (closed) 2) Reunus (fringe) • Solmut, joiden etäisyys puusta on yksi särmä (open) 3) Tuntematon (unseen) • Muut solmut, jotka ovat siis kauempana puusta 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 18 § Verkko (sen yhtenäinen osa) käydään läpi valitsemalla reunukselta jokin solmu, liittämällä se puuhun ja siirtämällä sen naapurit reunukseen § Eri algoritmit poikkeavat siinä • mikä solmu reunukselta valitaan • miten reunus on toteutettu § Lopputuloksena saadaan verkon virityspuu 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 19 Eräs mahdollinen virityspuu 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 20 10.4.1 Syvyyssuuntainen läpikäynti (depth-first search, DFS) § Menetelmässä valitaan aina reunuksen uusin solmu ja liitetään se puuhun (lopputuloksena syntyy verkon syvyyssuuntainen virityspuu) § Reunus toteutetaan pinona: § Pinon päällimmäinen solmu liitetään puuhun § Tämän vierekkäiset tuntemattomat solmut työnnetään pinoon § Pinon lisäksi ylläpidetään aputaulukoita visited[] ja parent[] • ∀ i: visited[i] • ∀ i: parent[i] 17. ja 24.11.2015 = 0, jos i tuntematon, = -1, jos i reunuksessa, ja > 0, jos i kuuluu virityspuuhun = solmun i isä verkon virityspuussa Tietorakenteet ja algoritmit - syksy 2015 21 10.4.2 Rekursiivinen DFS § Rekursiivinen toteutus käy verkon kaikki solmut läpi seuraavalla tavalla: 1. Vieraile (visit) solmussa 2. Tutki, onko seuraajalistan mukaisissa solmuissa vierailtu 3. Jos jossakin listan solmussa ei ole käyty, kutsu rekursiivista DFS:ää tälle solmulle § Rekursiivisen algoritmin ja pinoalgoritmin DFS-puut ovat erilaisia. Miksi? 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 22 Depth-first Search Algorithm DFS(G) Algorithm DFS-VISIT(G, u) 1. for each u V[G] do 1. visited[u] ← true 2. visited[u] ← false 2. for each v Adj[u] do 3. finished[u] ← false 3. if visited[v] = false then 4. for each u V[G] do 4. DFS-VISIT(G, v) 5. if visited[u] = false 5. finished[u] ← true 6. DFS-VISIT(G, u) Muuttuja u on askeltaja, joka käy läpi tietorakennetta (verkon solmuja). Jokaiselle solmulle on varattu yksisuuntaiset liput visited[u] ja finished[u]. Rekursiossa parametri G on kiintoarvo ja u on kulkija. Muuttuja v on askeltaja. 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 23 Mikä solmu merkitään lipulla finished (rivi 5) ensimmäisenä? 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 24 DFS algoritmin tehokkuus on: § Seuraajalistalle Θ(V + E) § Yhteysmatriisille Θ(V2) DFS-algoritmilla voidaan ratkaista eräitä tärkeitä verkkoihin liittyviä ongelmia, mm. § Onko verkko yhtenäinen? § Mitkä ovat verkon yhtenäiset osaverkot? § Onko verkossa silmukoita? 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 25 Luentotehtävä Esitä pinon sisältö, kun seuraava verkko käydään läpi eirekursiivisella DFS-algoritmille alkaen solmusta A. Esitä myös muodostuva virityspuu. A: B D C B: A C G C: B A E D: A E F I E: D H C F: D I G: B H: E I: D F 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 26 10.4.3 Leveyssuuntainen läpikäynti (breadth-first search, BFS) § Menetelmässä valitaan aina reunuksen vanhin solmu ja liitetään se puuhun § Reunus toteutetaan jonona: § Jonon ensimmäinen solmu liitetään puuhun § Tämän vierekkäiset alkiot laitetaan jonon loppuun, elleivät ne jo ole jonossa Tuloksena saadaan BFS-puu (leveyssuuntainen virityspuu) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 27 Breadth-first search 1. Initialize empty queue Q 2. for each u V[G] do 3. visited[u] ← false 4. finished[u] ← false 5. visited[s] ← true 6. ENQUEUE(Q, s) 7. while Q not empty do 8. u ← DEQUEUE(Q) 9. for each v Adj[u] do 10. if visited[v] = false then 10. visited[v] ← true 12. ENQUEUE(Q, v) 13. finished[u] ← true 17. ja 24.11.2015 // u: askeltaja // visited[u], finished[u]: // yksisuuntaiset liput // Q: säiliö (jono) // u: kulkija // v: askeltaja Tietorakenteet ja algoritmit - syksy 2015 28 BFS ratkaisee eräitä verkko-ongelmia § Mikä on lyhin reitti pisteestä A pisteeseen B, jos lasketaan vain kuljettujen särmien määrää? § Mitkä ovat lyhimmät reitit kaikkiin solmuihin lähtien solmusta A, jos lasketaan vain kuljettujen särmien määrää? DFS:n ja BFS:n perusero: § DFS etenee verkossa niin pitkälle kuin mahdollista ja peruuttaa sitten etsiessään uutta etenemishaaraa § BFS etenee verkossa leveällä rintamalla säilyttäen saman etäisyyden lähtöpisteeseen 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 29 § Reunuksen esittämiseen käytetty tietorakenne voidaan yleistää prioriteettijonoksi, jollain saadaan erilaisia PFS-hakuja (priorityfirst search) • Mikä on painotetun verkon pienin virityspuu? • Mikä on lyhin reitti pisteestä A pisteeseen B painotetussa verkossa? • Mitkä ovat lyhimmät reitit kaikkiin solmuihin lähtien solmusta A, jos verkko on painotettu? 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 30 10.5 Painotetut verkot (weighted graphs) § Painotetussa verkossa jokaiseen särmään liittyy kustannus, esim. • Aikataulu: hinta tai matkan pituus • Projektikaavio: osatyön kestoaika • Sähkökytkentä: johdon pituus § Algoritmeissa käytetään usein termiä etäisyys, vaikka kysymys on painosta § Yleensä painot ovat positiivisia. Negatiivisten painojen esiintyminen voi mutkistaa algoritmeja merkittävästi 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 31 § Painot voidaan esittää yhteysmatriisissa hyvin helposti A B 2 3 C A B C A 0 0 2 B 0 0 3 C 2 3 0 § Lävistäjäalkiot on selkeintä pitää nollina § Seuraajaluettelossa esitykseen täytyy liittää painotiedot: A: (C, 2) B: (C, 3) C: (A, 2), (B, 3) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 32 10.6 Pienin virityspuu (minimum spanning tree) § Yhtenäisen verkon pienin virityspuu on niiden särmien joukko, jotka yhdistävät verkon kaikki solmut toisiinsa siten, että kaarien painojen summa on pienin mahdollinen. ⇒ Pienin virityspuu ei ole välttämättä yksikäsitteinen ⇒ Tämän joukon täytyy olla välttämättä puu, koska muuten siinä olisi silmukka ja sen purkaminen vähentäisi kokonaispainoa. § Puu voidaan löytää useilla erilaisilla algoritmeilla 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 33 10.6.1 Primin algoritmi (pienimmän virityspuun laskemiseksi) § Verkko esitetään yhteysmatriisin avulla, jonka koko on V * V § Reunus toteutetaan prioriteettijonolla (taulukko kokoa |V|) § Jokaisella kierroksella käydään läpi yksi yhteysmatriisin rivi (solmusta k lähtevät särmät) ja tehdään seuraavat asiat: 1. Poistetaan pienimmän kustannuksen omaava solmu k prioriteettitaulukosta ja liitetään se puuhun 2. Lisätään k:n viereiset solmut prioriteettitaulukkoon ja merkitään niiden prioriteetiksi etäisyys k:hon 3. Jos viereinen solmu on jo prioriteettitaulukossa, päivitetään sen prioriteettiarvo, jos etäisyys k:hon on lyhyempi kuin aikaisemmin löydetty kaari 4. Etsitään prioriteettitaulukon pienin alkio, josta tulee uusi k seuraavalle kierrokselle 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 34 Esimerkki: Primin algoritmi 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 35 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 36 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 37 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 38 • Relaksaatio • Päivitetään arvoa prioriteettijonossa, jos löytyy lyhyempi yhteys Prioriteettijono b 2 (a) c 5 (a) 17. ja 24.11.2015 Prioriteettijono lisätään solmu b c 2 (b) c 5 (a) 5 a 2 Tietorakenteet ja algoritmit - syksy 2015 b 2 c 39 § Verkko voidaan esittää myös vieruslistana ja prioriteettijono keon avulla • Tehokkuus: O( (E + V) log V) § Primin algoritmissa riittää vierusmatriisin leveyden V kokoinen taulukko, jolloin tehokkuus on Θ(V2) (soveltuu tiheille verkoille). KUMPI ON TEHOKKAAMPI? Tiheille verkoille E=Θ(V2), jolloin (E+V) logV = Θ(V2 log V) Harvoille verkoille E=o(V2) , jolloin (E+V) logV = Ω(V log V) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 40 Lause: Kun verkon solmut jaetaan kahteen joukkoon, niin pienin virityspuu sisältää lyhimmän särmän, joka yhdistää näiden joukkojen jotkin kaksi solmua. a<b≤c≤d b a c d § Kyseiset joukot ovat {visited} ja {unvisited} 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 41 Todistus: Vastaväite: Kyseinen särmä ei kuulu pieninpään virityspuuhun. ⇒ Lyhin särmän voidaan lisätä pienimpään virityspuuhun ⇒ Vastaava pidempi yhteys voidaan poistaa ⇒ Saatiin uusi virityspuu, joka on pienempi ⇒ Alkuperäinen virityspuu ei ollutkaan pienin virityspuu ⇒ Päädytään ristiriitaan, joten alkuperäinen lause on tosi 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 42 Luentotehtävä Etsi seuraavan verkon pienin virityspuu. Piirrä reunus ja dad-taulukko algoritmin etenemisen aikana A: (B,2), (F,4) B: (A,2), (C,1), (D,3) C: (B,1), (D,2), (G,1) D: (B,3), (C,2), (E,1) E: (D,1), (G,5) F: (A,4), (G,4) G: (C,1), (E,5),(F,4) 17. ja 24.11.2015 https://trakla.cs.hut.fi/ebook/ebook-Pienin_virityspuu_Prim.html Tietorakenteet ja algoritmit - syksy 2015 43 10.7 Lyhin reitti (shortest path) § Halutaan löytää reitti solmusta A solmuun B siten, että polkuun kuuluvien särmien painojen summa on pienin mahdollinen § Tuloksena saadaan samalla lyhimpien reittien virityspuu (shortest paths spanning tree) § Useita eri algoritmeja 10.7.1 BFS § Jos painot ovat saman suuruisia, voidaan käyttää leveyssuuntaista läpikäyntiä 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 44 10.7.2 Dijkstran algoritmi § Verkko esitetään yhteysmatriisin avulla, jonka koko on V * V § Reunus toteutetaan prioriteettijonona (vrt. Primin algoritmi) § Jokaisella kierroksella käydään läpi yksi yhteysmatriisin rivi (solmusta k lähtevät särmät) ja tehdään seuraavat asiat: 1. Poistetaan solmu k prioriteettijonosta ja liitetään se puuhun 2. Lisätään k:n viereiset solmut prioriteettijonoon ja merkitään niiden prioriteetiksi etäisyys lähtösolmuun (k:n prioriteetti + k:n ja vierussolmun välinen paino) 3. Jos viereinen solmu on jo prioriteettijonossa, päivitetään sen prioriteettiarvoa mikäli löydetty uusi polku k:n kautta on lyhyempi kuin aiemmin löydetty etäisyys lähtösolmuun 4. Etsitään prioriteettijonon pienin alkio, josta tulee uusi k seuraavalle kierrokselle § Tehokkuus: O(V2) (soveltuu tiheille verkoille) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 45 10.7.2 Dijkstran algoritmi § Jos prioriteettijonon toteutuksena on keko ja verkko kuvataan seuraajalistan avulla suoritusaika on O( (E + V) log V) § Kyseessä on yleisesti ns. PFS-haku (Priority First Search) • Pienimmän virityspuun tapauksessa (Primin algoritmi) suurin prioriteetti on solmulla, joka on lähinnä jo löydettyä virityspuuta • Lyhimmän reitin etsinnässä (Dijkstran algoritmi) suurin prioriteetti on solmulla, jonka etäisyys lähtöspisteestä on lyhin. 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 46 Luentotehtävä Etsi lyhin reitti A:sta E:hen. Piirrä reunus ja dad-taulukko algoritmin etenemisen aikana A: (B,2), (F,3) B: (A,2), (C,1), (D,3) C: (B,1), (D,1), (G,1) D: (B,3), (C,1), (E,4) E: (D,4), (G,5) F: (A,3), (G,1) G: (C,1), (E,5),(F,1) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 47 1AlgorithmDijkstra(G,source)//G=(V,E),E⊆V×V 2foreachvinV://Alustus 3distance[v]:=infinity//Etäisyys(source,v)tuntematon 4previous[v]:=undefined//Virityspuunisälinkki 5distance[source]:=0//Etäisyys(source,source)=0 6Q:=thesetofallnodesinG//Reunustoteutetaanprior.jonona 7whileQisnotempty://Pääsilmukka 8u:=removevfromQwithsmallestdistance[] 9foreach(u,v)inE://Naapurisolmujentutkiminen 10if(dist:=distance[u]+distance(u,v))<distance[v]: 11distance[v]:=dist//löytyilyhyempireitti 12previous[v]:=u//päivitetäänisälinkki 13returnprevious[]//Lyhimpienpolkujenvirityspuu • Löytää lyhimmän polun kaikkiin verkon solmuihin (jos olemassa) • Miten haluttu polku (source, target) saadaan? • Entä jos mahdollisia lyhimpiä polkuja on useita? 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 48 10.7.4 Geometriset tehtävät § "Hae lyhin reitti tasolla olevassa verkossa pisteestä A pisteeseen B." § Käytetään PFS-hakua, jossa solmun x prioriteettina käytetään seuraavaa summaa Etäisyys d(A,x) virityspuuta pitkin laskien + geometrinen etäisyys d(x,B) Lopetetaan, kun B on lisätty puuhun => Lyhin reitti löytyy nopeasti, koska algoritmi hakeutuu heti oikeaan suuntaan verkossa 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 49 10.8 Verkon yhtenäisyys (graph connectivity) § Verkko on yhtenäinen, jos jokaisesta solmusta on polku kaikkiin muihin solmuihin § Epäyhtenäinen verkko koostuu yhtenäisistä osaverkoista § DFS-algoritmi löytää verkon yhtenäiset osat Jos rekursiivisessa DFS-haussa joudutaan tekemään eirekursiivinen DFS-VISIT:n kutsu, ollaan siirrytty toiseen osaverkkoon 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 50 Depth-first Search Algorithm DFS(G) 1. for each u V[G] do 2. visited[u] ← false 3. finished[u] ← false 4. for each u V[G] do 5. if visited[u] = false 6. DFS-VISIT(G, u) 17. ja 24.11.2015 Algorithm DFS-VISIT(G, u) 1. visited[u] ← true 2. for each v Adj[u] do 3. if visited[v] = false then 4. DFS-VISIT(G, v) 5. finished[u] ← true Tietorakenteet ja algoritmit - syksy 2015 51 10.8.1 Kahdesti yhtenevyys § Verkko on kahdesti yhtenäinen (biconnected), jos ja vain jos jokaisen solmuparin välillä on vähintään kaksi aidosti erilaista polkua § Kahdella aidosti erilaisella polulla ei saa olla muita yhteisiä solmuja kuin alku- ja loppusolmut § Leikkaussolmu (articulation point) on solmu, jonka poistaminen aiheuttaa verkon jakautumisen kahteen tai useampaan eri osaan ⇒ Kahdesti yhtenäisessä verkossa ei ole leikkaussolmuja Leikkaussolmut jakavat yhtenäisen verkon kahdesti yhteneviin osaverkkoihin 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 52 § Leikkaussolmu on kriittinen komponentti, jonka vioittuminen voi lamauttaa systeemin toiminnan § Kun tällaisia solmuja ei ole, saadaan vikasietoinen (fault tolerant) systeemi A D A C B D C E B E Miten leikkaussolmu voidaan havaita? 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 53 § Leikkaussolmut voidaan etsiä DFS-haun avulla tutkimalla syntyvää virityspuuta: 1. Solmu x (ei juuri) ei ole leikkaussolmu, jos sen jokaisen seuraajan muodostamasta alipuusta on yhteys virityspuuhun johonkin edeltäjään 2. Juuren yläpuolelle ei voi olla yhteyksiä. Siksi juuri on leikkaussolmu, jos sillä on useampia kuin yksi lapsi A D A C B 17. ja 24.11.2015 D C E B Tietorakenteet ja algoritmit - syksy 2015 E 54 Asian tutkiminen voidaan järjestää seuraavasti: § Jokainen rekursiivinen DFS-kutsu numeroi käsittelemänsä (visited) solmut käsittelyjärjestyksessä § Solmun edeltäjien järjestysnumero on ennen solmua itseään § Jokainen rekursiivinen DFS-kutsu palauttaa tiedon pienimmästä kutsun aikana nähdystä solmusta ⇒ Jos johonkin solmun k lapseen liittyvä kutsu palauttaa arvon, joka on ≥ k, k on leikkaussolmu § Algoritmin tehokkuus: • Seuraajaluettelossa: O(V + E) • Yhteysmatriisissa: O(V2) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 55 10.9 Suunnatut verkot § Suunnatussa verkossa särmiä voi kulkea vain yhteen suuntaan § Kahden solmun välillä voi olla kaksi eri suuntiin menevää särmää § Suunnattu verkko voi olla myös painotettu Esimerkkejä: • Helsingin katuverkko • Projektin ajoituskaavio 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 56 Ongelmia: 1) Pääseekö pisteestä A pisteeseen B? § Suunnatussa verkossa ei välttämässä pääse kaikista pisteistä toisiin pisteisiin, vaikka verkko olisi yhtenäinen 2) Muodosta suora yhteys kaikkiin niihin solmuihin, joihin pisteestä A voi päästä 3*) Etsi verkon topologinen lajittelu 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 57 Suunnatun verkon esitysmuoto: § Yhteysmatriisi ei ole symmetrinen A B C A B C A 1 0 0 B 0 1 0 C 1 1 1 § Seuraajaluettelossa on särmät vain yhteen kertaan A: C B: C C: 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 58 10.9.1 DFS-haku suunnatussa verkossa § Perusmenetelmä toimii samalla tavalla kuin suuntaamattomassa graafissa § Algoritmin avulla löydetään kaikki ne solmut, joihin on mahdollista päästä lähtösolmusta käsin § Syvyyssuuntaisen virityspuun sijasta syntyy yleensä metsä (DFS search forest) § Alunperin yhtenäisestä verkosta syntyy useita puita § Virityspuussa voi olla takautuvien kaarien (ylöspäin) lisäksi myös eteneviä kaaria (alaspäin) ja poikittaiskaaria (ristiin) eri solmujen välillä => Algoritmit, joissa tutkitaan virityspuun rakennetta, mutkistuvat. 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 59 Relaatioista § Olkoon verkko G = (V,E), jossa § • V on verkon solmujen joukko (esim. V = {x, y, z}) ja • E on verkon kaarien joukko E ⊆ V x V Binäärirelaatio E on (esim. E = {(x,x),(y,x),(x,y),(y,z),(x,z)}) • refleksiivinen, jos kaikille u ∈ V pätee (u,u) ∈ E • symmetrinen, jos (u,v) ∈ E → (v,u) ∈ E • transitiivinen, jos (u,v) ∈ E ja (v,w) ∈ E → (u,w) ∈ E x x y x y z § Relaatio, joka on refleksiivinen, symmetrinen sekä transitiivinen on ekvivalenssirelaatio • vrt ”yhtäsuuruus” luonnollisille luvuille ü mutta ei esim. ”pienempi tai yhtäsuuri”, joka voidaan määritellä { (a,b) : a,b ∈ N ja a≤b } (antisymmetrinen) ja muodostaa osittaisjärjestyksen 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 60 10.9.2 Transitiivinen sulkeuma (transitive closure) § Jos suunnattuun verkkoon lisätään välit XY, mikäli X:stä on olemassa reitti Y:hyn kaikille solmuille X ja Y, saadaan verkon transitiivinen sulkeuma § Se ilmaisee suunnatun verkon yhtenäisyyden mahdollisimman kompaktisti. Sen avulla on helppo vastata kysymykseen: "Onko reittiä solmusta A solmuun B?" § Transitiivinen sulkeuma voidaan tuottaa DFS-haun avulla, kun haku suoritetaan lähtien kaikista solmuista erikseen ja lisätään verkkoon kaikki kaaret lähtösolmusta löydettyihin solmuihin. § Tehokkuus: • Seuraajaluettelolla: O( V(E + V) ) • Yhteysmatriisilla: O(V3) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 61 10.9.3 Topologinen lajittelu (topological sorting) § Joissakin verkkosovelluksissa silmukat eivät ole mielekkäitä. Esimerkki: • Työnkulkukaaviossa ei ehkä ole mielekästä, että vaihetta A seuraa vaihe B, jota seuraa vaihe C, jota seuraa vaihe A. § Suunnattu verkko, jossa ei ole silmukoita, on nimeltään DAG (Directed Acyclic Graph) § Sen syvyyssuuntaisessa virityspuussa ei ole takautuvia (ylöspäin osoittavia) kaaria § Kun DAGin solmut esitetään siinä järjestyksessä, että kaikki solmun edeltäjät ovat listassa ennen ko. solmua, saadaan verkon topologinen lajittelu 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 62 § Jos mukaan piirrettäisiin kaarien suunnat, ne menisivät kaikki vasemmalta oikealle § Hyödyllinen esitysmuoto esim. projektin ajoituskaaviolle • Kullekin osavaiheelle välttämättömät esivaiheet selvästi näkyvillä Luentotehtävä: piirrä oheinen verkko siten, että solmut ovat järjestyksessä (vasemmalta oikealla): 3, 5, 7, 8, 11, 9, 2, 10 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 63 Topologinen lajittelu voidaan muodostaa eri tavoin 1. Poistetaan verkosta solmu, josta ei lähde yhtään kaarta • • • • Samalla poistetaan siihen saapuvat kaaret (matriisin sarake) Päivitetään tieto myös poistettujen kaarten lähtösolmujen osalta (laskuri / solmu) Valitetaan seuraavaa poistoa varten uusi solmu. Lopuksi tulostetaan solmut käänteisessä järjestyksessä 2. DFS-haun avulla seuraavasti: • • Käännetään kaikkien särmien järjestys Tulostetaan solmun nimi juuri ennen Visit-proseduurin päättymistä 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 64 3. Vaihtoehtoisesti voidaan toimia näin: • Tulostetaan solmun nimi juuri ennen Visit-proseduurin päättymistä, jolloin kaikki seuraajat on jo käsitelty • Tuloksena saadaan käänteinen topologinen lajittelu (reverse topological sorting). Se kuvaa tilannetta, jossa solmun nimeä seuraavat ne solmut, joista ko. solmu on riippuvainen • Tulostetaan tämä päinvastaisessa järjestyksessä § Topologinen lajittelu saadaan laskettua ajassa Θ(E + V) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 65 10.9.4 Vahvasti yhtenäiset komponentit (strongly connected components) § Jos suunnatussa verkossa on joukko solmuja, joista jokaisesta pääsee saman joukon muihin solmuihin, on kyseessä vahvasti yhtenäinen komponentti § Tällaisten komponenttien ulkopuolelle ei ole edestakaista yhteyttä § Komponentit pystytään löytämään DFS-haulla, jota muokataan sopivasti: • Tunnistetaan tilanteet, joissa syntyy suunnattu silmukka, eli viitataan hakupuussa ylöspäin jo läpikäytyyn solmuun. § Vahvasti yhtenäisten komponenttien laskemisesta on hyötyä transitiivisen sulkeuman laskemisessa. 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 66 11.10 Joukot ja verkot § Joukko (set) on kokoelma alkioita § Verkko- ja joukkorakenteita voidaan joissakin ongelmissa käsitellä samalla tavalla Analogiat: solmu = joukon alkio särmä = alkiot kuuluvat samaan joukkoon verkon yhtenäinen osa = joukko 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 67 Eräitä ratkaistavia ongelmia: § Kuuluvatko solmut A ja B verkon samaan yhtenäiseen osaan? § Kuuluvatko alkiot X ja Y samaan joukkoon? § Ratkaisuna on kaksi eri algoritmia 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 68 11.10.1 DFS-haku § Jos verkko on rakenteeltaan staattinen, käydään verkko läpi DFS- haulla ja merkitään solmutaulukkoon jokainen erillinen osaverkko omalla tunnuksella ⇒ Ongelma ratkeaa vertaamalla sitä, ovatko A:n ja B:n osaverkkojen tunnukset samat § Jos verkkoon lisätään särmä, kaikki on tehtävä uudestaan ⇒ Dynaamiseen tilanteeseen tarvitaan erilainen algoritmi 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 69 11.10.2 Etsi-Liitä-algoritmi (Union-find) § Algoritmia käytetään tilanteissa, joissa verkkoon (joukkoon) liitetään peräkkäin uusia särmiä (yhteenkuuluvuuksia) § Jokaisen lisäyksen jälkeen voidaan heti kysyä, kuuluvatko jotkin solmut (alkiot) samaan komponenttiin (joukkoon) Huom! Algoritmissa muodostuva tietorakenne ei vastaa alkuperäistä verkkoa, vaan on ainoastaan apuväline tässä ongelmassa 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 70 Perusalgoritmin toiminta: § Luodaan aluksi metsä, jossa kaikki solmut ovat erillisinä puina § Kun rakenteeseen lisätään verkkoon kuuluvia särmiä, yhdistetään metsään kuuluvia puita yhteen § Tarvittavat toiminnot Etsi (find) ja Liitä (union) toteutetaan seuraavasti: Etsi: • Kulje molemmista särmän päätesolmuista puun juurta kohden ja katso, löytyykö yhteinen isä 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 71 Liitä: • Jos särmän päätepisteet kuuluvat samaan puuhun, ei tehdä mitään • Jos päätepisteet kuuluvat eri puihin, puut yhdistetään siten, että loppupisteen sisältävä puu tulee alkupisteen sisältävän puun juuren alipuuksi § Metsä esitetään dad-linkkien avulla, jolloin juuren etsiminen ja puiden yhdistäminen on helppoa 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 72 Esimerkki: Verkkoon kuuluu solmut A-M ja siihen liitetään särmiä järjestyksessä AG, AB, AC, LM, JM, JL, JK, ED, FD, HI, FE, AF, GE, GC, GH, JG ja LG. 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 73 § Perusalgoritmi toimii huonosti, jos lisättävät särmät ovat sopivassa järjestyksessä. Esimerkiksi: BA, CB, DC, ED, ... tai BA, CA, DA, EA, ... ⇒ Rakenne degeneroituu listaksi, jolloin tehokkuus on kvadraattinen § Ongelma voidaan kiertää muuttamalla algoritmia hieman: 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 74 11.10.3 Tasapainotus painon mukaan (weight balancing, balancing by size) § Liitä-operaatiossa yhteiseksi juureksi tulee se puu, joka on suurempi § Kunkin puun juureen liitetään tieto puun koosta 11.10.4 Tasapainotus korkeuden mukaan (height balancing) § Liitä-operaatiossa yhteiseksi juureksi tulee se puu, joka on korkeampi § Kunkin puun juureen liitetään tieto puun korkeudesta 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 75 11.10.5 Polun tiivistäminen (path compressing) § Kun juuri on löytynyt, liitetään kaikki lähtösolmusta juureen kulkevan polun solmut suoraan juuren alle. Tämä tehdään sekä särmän alku- että loppusolmulle. ⇒ Puun korkeus pienenee, mikä nopeuttaa algoritmia § Menetelmiä voidaan myös yhdistää, jolloin algoritmin tehokkuus on O(E α (E)), missä α (E) < 4, kun log(log(log... (E)...)) ≤ 1 16 kpl 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 76 § Toteutus isälinkitettynä puuna (taulukko) § Algoritmin vaatima tila ≈ V, vaikka verkossa voi olla E ≈ V2 ⇒ Hyvin suurten verkkojen yhtenevyyttä voidaan helposti tutkia § DFS vaatisi tilaa kaikille särmille 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 77 11.10.6 Sovellus: Kruskalin algoritmi Verkon pienin virityspuu voidaan laskea seuraavasti: § Ideana on rakentaa asteittain verkon komponentteja suuremmiksi. Uudet lisättävät särmät voivat joko liittää kaksi komponenttia yhteen tai muodostaa silmukan yhdessä komponentissa (jolloin lisäystä ei tehdä). § Verkko esitetään seuraajalistan avulla § Verkon särmät lisätään yksi kerrallaan aloittaen lyhimmästä, kunnes kaikki solmut on yhdistetty § Jos särmä muodostaisi silmukan, sitä ei liitetä mukaan § Silmukat voidaan todeta union-find-algoritmilla § Algoritmin oikeellisuus perustuu kohdan 11.6.1 lauseeseen § Tehokkuus: O(E log E) 17. ja 24.11.2015 Tietorakenteet ja algoritmit - syksy 2015 78
© Copyright 2024