Tietorakenteet ja algoritmit. Verkot. Ari Korhonen



Samankaltaiset tiedostot
A TIETORAKENTEET JA ALGORITMIT

10. Painotetut graafit

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

Algoritmi on periaatteellisella tasolla seuraava:

Eräs keskeinen algoritmien suunnittelutekniikka on. Palauta ongelma johonkin tunnettuun verkko-ongelmaan.

Algoritmit 1. Luento 13 Ti Timo Männikkö

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen.

Algoritmit 1. Luento 8 Ke Timo Männikkö

13 Lyhimmät painotetut polut

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

A TIETORAKENTEET JA ALGORITMIT

A TIETORAKENTEET JA ALGORITMIT

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa1 : Leveys- ja syvyyshaku

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

TIE Tietorakenteet ja algoritmit 261

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut

Algoritmit 1. Luento 9 Ti Timo Männikkö

Pienin virittävä puu (minimum spanning tree)

10. Painotetut graafit

Johdatus graafiteoriaan

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)

Diskreetit rakenteet

Johdatus graafiteoriaan

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Miten käydä läpi puun alkiot (traversal)?

Algoritmit 1. Luento 13 Ma Timo Männikkö

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

v 8 v 9 v 5 C v 3 v 4

Tietorakenteet ja algoritmit. Kertaus. Ari Korhonen

Tietorakenteet ja algoritmit - syksy

9. Graafit Graafin abstrakti tietotyyppi

Liite 2: Verkot ja todennäköisyyslaskenta

6.4. Järjestyssuhteet

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen

0 v i v j / E, M ij = 1 v i v j E.

T : Max-flow / min-cut -ongelmat

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Algoritmit 2. Luento 7 Ti Timo Männikkö

Johdatus verkkoteoriaan 4. luento

Verkon virittävät puut

Luku 8. Aluekyselyt. 8.1 Summataulukko

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

Lyhin kahden solmun välinen polku

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Graafin virittävä puu 1 / 20

Algoritmit 2. Luento 11 Ti Timo Männikkö

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Silmukkaoptimoinnista

Algoritmit 2. Demot Timo Männikkö

Muuttujien roolit Kiintoarvo cin >> r;

Koe ma 1.3 klo salissa A111, koeaika kuten tavallista 2h 30min

Alaraja vertailuihin perustuvalle järjestämiselle

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

Algoritmit 2. Luento 14 Ke Timo Männikkö

14. Luennon sisältö. Kuljetustehtävä. Verkkoteoria ja optimointi. esimerkki. verkkoteorian optimointitehtäviä verkon virittävä puu lyhimmät polut

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

j(j 1) = n(n2 1) 3 + (k + 1)k = (k + 1)(k2 k + 3k) 3 = (k + 1)(k2 + 2k + 1 1)

Tietorakenteet, esimerkkivastauksia viikon 12 laskareihin

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Tiraka, yhteenveto tenttiinlukua varten

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

Jos d-kohdan vasemmalla puolella perusjoukkona on X, niin oikealla puolella

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

8.5. Järjestyssuhteet 1 / 19

PARITUS KAKSIJAKOISESSA

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Algoritmit 2. Luento 12 Ke Timo Männikkö

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

Näytetään nyt relaatioon liittyvien ekvivalenssiluokkien olevan verkon G lohkojen särmäjoukkoja. Olkoon siis f verkon G jokin särmä.

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Valitsemalla sopivat alkiot joudutaan tämän määritelmän kanssa vaikeuksiin, jotka voidaan välttää rakentamalla joukko oppi aksiomaattisesti.

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Stabiloivat synkronoijat ja nimeäminen

VERKKOTEORIAN ALKEITA. Martti E. Pesonen

1 Erilaisia tapoja järjestää

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.

Ohjelmoinnin peruskurssi Y1

6 Verkkoalgoritmeja. 6.1 Verkkojen esitystapoja

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

5 Verkkoalgoritmeja. 5.1 Verkkojen esitystapoja

Algoritmit 1. Luento 14 Ke Timo Männikkö

Transkriptio:

Tietorakenteet ja algoritmit Verkot Ari Korhonen 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 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 E 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 A D C B 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? 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) 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 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 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ä. 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 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 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(V 2 ) 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ää. 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? 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 C B A B C 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 C B A B C 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 16

A F B C G D E 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 H I 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 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 19

Eräs mahdollinen virityspuu 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[] = 0, jos i tuntematon, i: visited[i] = -1, jos i reunuksessa, ja > 0, jos i kuuluu virityspuuhun i: parent[i] = solmun i isä verkon virityspuussa 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? 22

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) 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 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. 23

Mikä solmu merkitään lipulla finished (rivi 5) ensimmäisenä? 24

DFS algoritmin tehokkuus on: Seuraajalistalle Θ(V + E) Yhteysmatriisille Θ(V 2 ) 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? 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 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) 27

Breadth-first search 1. Initialize empty queue Q 2. for each u V[G] do // u: askeltaja 3. visited[u] false // visited[u], finished[u]: 4. finished[u] false // yksisuuntaiset liput 5. visited[s] true 6. ENQUEUE(Q, s) // Q: säiliö (jono) 7. while Q not empty do 8. u DEQUEUE(Q) // u: kulkija 9. for each v Adj[u] do // v: askeltaja 10. if visited[v] = false then 10. visited[v] true 12. ENQUEUE(Q, v) 13. finished[u] true 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 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? 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 31

Painot voidaan esittää yhteysmatriisissa hyvin helposti A 2 3 C B 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) 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 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 34

Esimerkki: Primin algoritmi 35

36

37

38

Relaksaatio Päivitetään arvoa prioriteettijonossa, jos löytyy lyhyempi yhteys Prioriteettijono b 2 (a) c 5 (a) lisätään solmu b Prioriteettijono c 2 (b) c 5 (a) 5 a 2 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 Θ(V 2 ) (soveltuu tiheille verkoille). KUMPI ON TEHOKKAAMPI? Tiheille verkoille E=Θ(V 2 ), jolloin (E+V) logv = Θ(V 2 log V) Harvoille verkoille E=o(V 2 ), jolloin (E+V) logv = Ω(V log V) 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} 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 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) https://trakla.cs.hut.fi/ebook/ebook-pienin_virityspuu_prim.html 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ä 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(V 2 ) (soveltuu tiheille verkoille) 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. 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) 47

1 Algorithm Dijkstra(G, source) // G = (V,E), E V V 2 for each v in V: // Alustus 3 distance[v] := infinity // Etäisyys (source, v) tuntematon 4 previous[v] := undefined // Virityspuun isälinkki 5 distance[source] := 0 // Etäisyys (source, source) = 0 6 Q := the set of all nodes in G // Reunus toteutetaan prior.jonona 7 while Q is not empty: // Pääsilmukka 8 u := remove v from Q with smallest distance[] 9 for each (u, v) in E: // Naapurisolmujen tutkiminen 10 if (dist := distance[u] + distance(u, v)) < distance[v]: 11 distance[v] := dist // löytyi lyhyempi reitti 12 previous[v] := u // päivitetään isälinkki 13 return previous[] // Lyhimpien polkujen virityspuu Löytää lyhimmän polun kaikkiin verkon solmuihin (jos olemassa) Miten haluttu polku (source, target) saadaan? Entä jos mahdollisia lyhimpiä polkuja on useita? 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 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 ei- rekursiivinen DFS-VISIT:n kutsu, ollaan siirrytty toiseen osaverkkoon 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) 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 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 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 D B C E B C E Miten leikkaussolmu voidaan havaita? 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 D B C E B C 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(V 2 ) 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 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 57

Suunnatun verkon esitysmuoto: Yhteysmatriisi ei ole symmetrinen A C B A B C A 1 0 1 B 0 1 1 C 0 0 1 Seuraajaluettelossa on särmät vain yhteen kertaan A: C B: C C: - 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. 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 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(V 3 ) 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 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 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ä 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) 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. 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 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 68

11.10.1 DFS-haku Jos verkko on rakenteeltaan staattinen, käydään verkko läpi DFShaulla 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 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 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ä 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 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. 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: 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 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 76

Toteutus isälinkitettynä puuna (taulukko) Algoritmin vaatima tila V, vaikka verkossa voi olla E V 2 Hyvin suurten verkkojen yhtenevyyttä voidaan helposti tutkia DFS vaatisi tilaa kaikille särmille 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) 78