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.

Samankaltaiset tiedostot
58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Algoritmit 1. Luento 8 Ke Timo Männikkö

Luku 8. Aluekyselyt. 8.1 Summataulukko

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

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

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

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

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

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

TIE Tietorakenteet ja algoritmit 261

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

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

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

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

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

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

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

Algoritmit 1. Luento 7 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Algoritmit 2. Luento 2 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Tietorakenteet ja algoritmit

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Algoritmit 1. Luento 14 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

Algoritmit 2. Luento 2 To Timo Männikkö

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

A TIETORAKENTEET JA ALGORITMIT

Tietorakenteet, laskuharjoitus 6,

13 Lyhimmät painotetut polut

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Johdatus graafiteoriaan

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

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

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

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

4. Joukkojen käsittely

811120P Diskreetit rakenteet

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

Algoritmit 2. Luento 13 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Algoritmit 1. Demot Timo Männikkö

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

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

Algoritmit 2. Luento 10 To Timo Männikkö

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Datatähti 2019 loppu

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 2. Luento 9 Ti Timo Männikkö

Tietorakenteet ja algoritmit - syksy

Algoritmit 1. Luento 13 Ti Timo Männikkö

Kysymyksiä koko kurssista?

Algoritmit 2. Luento 11 Ti Timo Männikkö

Ohjelmoinnin peruskurssien laaja oppimäärä

Binäärihaun vertailujärjestys

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

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

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

Algoritmit 1. Luento 6 Ke Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Algoritmit 2. Demot Timo Männikkö

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Lyhin kahden solmun välinen polku

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Demot Timo Männikkö

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

Tietorakenteet, esimerkkivastauksia viikon 12 laskareihin

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 3 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit V Hash-taulukot ja binääriset etsintäpuut

Algoritmit 1. Luento 2 Ke Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

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

Ohjelmoinnin peruskurssi Y1

Tarkennamme geneeristä painamiskorotusalgoritmia

Pienin virittävä puu (minimum spanning tree)

Algoritmit 2. Luento 6 To Timo Männikkö

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

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

Induktiotodistus: Tapaus n = 0 selvä; ol. väite pätee kun n < m.

Algoritmit 2. Luento 10 To Timo Männikkö

Transkriptio:

Tietorakenteet, laskuharjoitus 11, ratkaisuja 1. Leveyssuuntaisen läpikäynnin voi toteuttaa rekursiivisesti käsittelemällä jokaisella rekursiivisella kutsulla kaikki tietyllä tasolla olevat solmut. Rekursiivinen aliohjelma saa parametrinaan listan käsiteltävistä solmuista ja se välittää eteenpäin uuden listan niiden naapureista, joita ei ole vielä käsitelty. Syvyyssuuntaisen läpikäynnin voi toteuttaa iteratiivisesti korvaamalla rekursion pinolla. Tällöin koodi on samanlainen kuin leveyssuuntaisessa läpikäynnissä, paitsi että jonon sijasta käytetään pinoa. Leveyssuuntaisessa läpikäynnissä rekursiosta ei ole aitoa hyötyä, minkä vuoksi algoritmin luontevampi toteutus on iteratiivinen. Syvyyssuuntaisessa läpikäynnissä molemmat toteutukset (iteratiivinen ja rekursiivinen) ovat tavallisia. 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. 3. Seuraavassa kuvassa ovat verkon vahvasti yhtenäiset komponentit: a b c d e f g h i Kuva 2: Tehtävän 3 vahvasti yhtenäiset komponentit. Tarkastelemalla verkon vahvasti yhtenäisistä komponenteista (kuva 3) muodostettua verkkoa on helppo nähdä, että verkkoon tarvitsee lisätä ainakin kaksi kaarta, jotta siitä saadaan vahvasti yhtenäinen. 1

Kuva 3: Tehtävän 3 vahvasti yhtenäisten komponenttien verkko. Yksi kaari ei riitä verkon yhtenäistämiseksi, koska a:n ja h:n komponenteista ei pääse muihin komponentteihin ilman, että verkkoon lisätään molempiin komponentteihin uusi lähtevä kaari. Yksi mahdollisuus on lisätä kaaret b:stä e:hen ja h:sta g:hen, jolloin alkuperäiset komponentit muodostavat ketjun ja kuuluvat siis kaikki samaan komponenttiin. 4. Ratkaisutapa 1: Muutetaan vieruslistaesitystä niin, että listojen sijasta käytetään taulukkoja. Tämä ei muuta tilankäyttöä, joka on edelleen O( E + V ). Lisäksi pidetään huolta siitä, että taulukot ovat järjestyksessä, jolloin kaaren etsiminen onnistuu binäärihaulla ajassa O(log V ). Ratkaisun huonona puolena on, että jos verkko muuttuu (kaaria täytyy lisätä tai poistaa), taulukoiden päivitys on hidasta. Ratkaisutapa 2: Tallennetaan kaikki verkon kaaret yhteen taulukkoon, joka on järjestetty ensisijaisesti lähtösolmun ja toissijaisesti kohdesolmun mukaan. Tilaa kuluu vain O( E ), koska muistissa ovat vain kaaret. Kaaren etsiminen tapahtuu jälleen binäärihaulla ajassa O(log E ) = O(log( V 2 )) = O(log V ). Tämänkin ratkaisun ongelmana on, että taulukon muuttaminen on hidasta. Molemmissa ratkaisutavoissa voi käyttää myös tasapainotettua binääripuuta (esim. AVL-puuta) taulukon sijaan. Tällöin myös verkon muuttaminen onnistuu ajassa O(log V ), mutta toteutus on huomattavasti monimutkaisempi. 5. Yksinkertaisin tapa tutkia onko verkko haavoittuva on kokeilla poistaa jokainen solmu vuorollaan, ja sen jälkeen tarkastaa verkon läpikäynnillä onko se yhtenäinen. Menetelmä vie aikaa O( V 2 + V E )). Algoritmi on esitetty ohessa vielä pseudokoodilla. Algoritmissa käytetään aputaulukkoa K merkitsemään onko solmussa jo vierailtu. 2

Haavoittuva (G) 1 for jokaiselle solmulle v V 2 Alusta False jokaiseksi aputaulukon K arvoksi 3 K[v] = True / Poistetaan solmu 4 l = DFS(x), missä x V ja x v 5 if l < V 1 / Kaikissa solmuissa ei vierailtu läpikäynnissä 6 return True 7 return False DFS(v) 1 if K[v] = = True 2 return 0 3 K[v] = True / Merkitään solmu vierailluksi. 4 l = 1 / Solmuja vierailtu tämän läpikäynnin aikana. 5 for jokaiselle v:n naapurille x 6 l = l + DFS(x) 7 return l Ongelman ratkaisuun on olemassa myös yksittäiseen syvyyssuuntaiseen läpikäyntiin pohjautuva tapa, joka vie ajan O( V + E ). Algoritmi tarkastelee syvyyssuuntaisen läpikäynnin muodostamaa puuta. Jokaiseen puun solmuun liitetään tieto solmusta, joka on lähimpänä puun juurta ja johon päästään tarkasteltavasta solmusta. Kutsutaan tätä solmua alisolmuksi. Jos jonkun solmun alisolmu on sen vanhempi syvyyssuuntaisen läpikäynnin muodostamassa puussa, niin tämän vanhemman poisto rikkoisi verkon yhtenäisyyden. Ohessa on esitetty algoritmi pseudokoodilla. Algoritmi käyttää apunaan aputaulukkoja K, A ja S. Taulukkoon K merkitään onko solmussa jo vierailtu. Taulukossa A pidetään yllä tietoa solmujen alisolmuista. Taulukkoon S merkitään kunkin solmun syvyys läpikäynnin muodostamassa puussa. Haavoittuva (G) 1 Jollekin v V 2 S[v] = 1 3 K[v] = True 4 for solmun v naapureille x 5 Vieraile(x, 2) 3

Vieraile(v, s) 1 A[v] = s 1 / Solmun vanhempi on toistaiseksi Alisolmu. 2 S[v] = s / Talletetaan syvyys. 3 K[v] = True / Merkitään solmu vierailluksi. 4 for solmun v naapureille x 5 if K[x] = = True 6 if S[x] < A[v] 7 A[v] = S[x] / Naapuri, joka on lähempänä juurta. 8 else 9 l = Vieraile(x, s + 1) 10 if l = = S[v] 11 Solmu on lapsensa alisolmu eli verkko on haavoittuva. 12 else if l < A[v] 13 A[v] = l / Myös tästä solmusta pääsee lapsen alisolmuun. 14 return A[v] 6. Ongelma voidaan ratkaista soveltamalla leveyssuuntaista läpikäyntiä. Tehdään leveyssuuntainen läpikäynti käyttämällä jonoja P ja S. Toiseen jonoon lisätään sellaiset solmut, joihin päästiin punaisella kaarella ja toiseen jonoon lisätään solmut, joihin päästiin sinisellä kaarella. Talletetaan lisäksi jokaiseen solmuun s viitteet s. pun ja s. sin pitämään yllä tietoa, mistä solmusta solmuun s tultiin. Ohessa on algoritmin esitys pseudokoodina. Aluksi verkko käydään kokonaisuudessaan läpi (läpikäynti voitaisiin lopettaa myös välittomästi kohdattaessa t). Tämän jälkeen polku s t kerätään pinoon kulkemalla viitteitä s.pun ja s. sin pitkin valitsemalla aina s. pun kun mahdollista. Lopuksi pinon sisältö tulostetaan. TulostaPolku (s, t) 1 alusta pino S 2 x = t 3 while x s 4 työnnä x pinoon S 5 if x.pun Nil 6 x = x.pun 7 else 8 x = x.sin 9 työnnä s pinoon S 10 tulosta pinon S sisältö pinojärjestyksessä 4

SiniPunaPolku (G, s, t) 1 s.pun = s.sin = s 2 for solmun s naapureille x 3 if kaari s x on punainen 4 lisää solmu x jonoon P 5 x.pun = s 6 else 7 lisää solmu x jonoon S 8 x.sin = s 9 while P ja S 10 ota solmu v jonon P päästä 11 for solmun v naapureille x 12 if kaari v x on punainen ja v.pun = = Nil 13 lisää solmu x jonoon P 14 x.pun = s 15 else if v.sin = = Nil 16 lisää solmu x jonoon S 17 x.sin = s 18 ota solmu v jonon S päästä 19 for solmun v naapureille x 20 if kaari v x on sininen ja v.sin = = Nil 21 lisää solmu x jonoon S 22 x.sin = s 23 TulostaPolku (s, t) 7. Tiedosto Riippuvuus.java sisältää Java-kielisen ohjelman, joka etsii kelvollisen riippuvuuksien järjestyksen, jos sellainen on olemassa. Kyseessä on syklittömyyden tarkastamisen ja topologisen järjestämisen sovellus. 5