Algoritmit 1 Luento 8 Ke 1.2.2017 Timo Männikkö
Luento 8 Järjestetty binääripuu Solmujen läpikäynti Binääripuun korkeus Binääripuun tasapainottaminen Graafit ja verkot Verkon lyhimmät polut Fordin ja Fulkersonin menetelmä Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 2/30
Järjestetty binääripuu f b g 7 7 a d c e i h Binääripuu järjestetty, jos kaikilla a ja b on a b a b Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 3/30
Binääripuun solmujen läpikäynti Esijärjestys (preorder): 1. Käsitellään tarkasteltava solmu 2. Jos tarkasteltavan solmun vasen alipuu ei ole tyhjä, käsitellään tämä vasen alipuu esijärjestyksessä 3. Jos tarkasteltavan solmun oikea alipuu ei ole tyhjä, käsitellään tämä oikea alipuu esijärjestyksessä Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 4/30
Binääripuun solmujen läpikäynti Sisäjärjestys (inorder): 1. Jos tarkasteltavan solmun vasen alipuu ei ole tyhjä, käsitellään tämä vasen alipuu sisäjärjestyksessä 2. Käsitellään tarkasteltava solmu 3. Jos tarkasteltavan solmun oikea alipuu ei ole tyhjä, käsitellään tämä oikea alipuu sisäjärjestyksessä Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 5/30
Binääripuun solmujen läpikäynti Jälkijärjestys (postorder): 1. Jos tarkasteltavan solmun vasen alipuu ei ole tyhjä, käsitellään tämä vasen alipuu jälkijärjestyksessä 2. Jos tarkasteltavan solmun oikea alipuu ei ole tyhjä, käsitellään tämä oikea alipuu jälkijärjestyksessä 3. Käsitellään tarkasteltava solmu Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 6/30
Esimerkki: Binääripuun korkeus Solmun korkeus on pisimmän siitä lehtisolmuun vievän polun pituus Lehtisolmun korkeus on 0 Määritellään: Tyhjän puun korkeus on 1 Juuren korkeus = suurempi alipuiden korkeuksista + 1 Käydään puu läpi rekursiivisesti jälkijärjestyksessä Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 7/30
Esimerkki: Binääripuun korkeus binpuunkorkeus(solmu) 1. Jos solmu = null, palautetaan 1 2. Jos solmu.left = null, asetetaan vasen = 1, muuten asetetaan vasen = binpuunkorkeus(solmu.left) 3. Jos solmu.right = null, asetetaan oikea = 1, muuten asetetaan oikea = binpuunkorkeus(solmu.right) 4. Jos vasen > oikea, palautetaan vasen+1, muuten palautetaan oikea+1 Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 8/30
Esimerkki: Aritmeettinen lauseke Lauseke (a + b) c + d binääripuuna Esijärjestyksessä prefix-merkintätavan mukainen järjestys: + + a b c d + + c a b d Jälkijärjestyksessä postfix-merkintätavan mukainen järjestys: a b + c d + Sisäjärjestyksessä saadaan järjestys: a + b c + d Täytyy lisätä sulut Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 9/30
Puun läpikäynti ilman rekursiota Binääripuun läpikäynti sisäjärjestyksessä pinon avulla Aina kun mennään solmusta vasemmalle, tallennetaan solmun osoitin pinoon 1. Aloitus: Aloitetaan juurisolmusta Kuljetaan vasemmalle kunnes tullaan solmuun, jonka vasen alipuu on tyhjä Kaikki kuljetut solmut tallennetaan pinoon (Algoritmi jatkuu) Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 10/30
Puun läpikäynti ilman rekursiota 2. Vuorossa olevan solmun saanti: Jos pino tyhjä, lopetetaan Muuten poistetaan pinosta sen päällimmäinen solmu p Olkoon q = p.right Jos q null: Tallennetaan solmu q pinoon Kuljetaan solmusta q vasemmalle kunnes tullaan solmuun, jonka vasen alipuu tyhjä Kaikki kuljetut solmut tallennetaan pinoon Solmu p on nyt seuraava vuorossa oleva solmu Toistetaan kohdasta 2 Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 11/30
Binääripuun korkeus Tasapainoinen binääripuu: Jokaisella solmulla (paitsi lehtisolmuilla) kaksi lasta 7 7 Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 12/30
Binääripuun korkeus Tasapainoinen binääripuu: Korkeus h Tasot 0, 1, 2,..., h Solmuja tasoilla 1, 2, 4,..., 2 h Solmuja yhteensä n = 1 + 2 + 4 + + 2 h h = 2 i = 2 h+1 1 i=0 h = log 2 (n + 1) 1 Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 13/30
Binääripuun korkeus Degeneroitunut binääripuu: Muodostuu esimerkiksi, jos solmut lisätään kasvavassa järjestyksessä Tällöin puussa pelkästään oikeita lapsisolmuja h = n 1 Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 14/30
Operaatioiden aikavaativuus Puun läpikäynti (jossain järjestyksessä): Kaikki solmut käsitellään Vaativuus O(n) Perusoperaatiot (haku, lisäys, poisto): Askelten lukumäärä Puun korkeus Tasapainoiselle puulle vaativuus O(log n) Degeneroituneelle puulle vaativuus O(n) Voidaan osoittaa: Satunnaisesti muodostetussa binääripuussa hakupolun keskipituus 1.39 log 2 n Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 15/30
Binääripuu hakemistona Hakemisto (sanakirja, dictionary): Tietorakenne, jonka perusoperaatioita ovat alkion haku, alkion lisäys ja alkion poisto Järjestetty lineaarinen lista: Perusoperaatiot O(n) Järjestetty binääripuu: Perusoperaatiot O(log n), kun puu on tasapainoinen Esimerkiksi haku, kun n = 1000: Linneaarinen lista: Vertailuja keskimäärin 500 Binääripuu: Vertailuja keskimäärin 14 Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 16/30
Binääripuun tasapainottaminen Hakujen yhteydessä tarkkaillaan hakupolkujen pituuksia Jos pituudet ovat paljon suurempia kuin teoreettinen keskipituus, on puu epätasapainoinen Voidaan yrittää tasapainottaa puu Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 17/30
Binääripuun tasapainottaminen Puun tasapainottaminen rekursiivisesti: Käydään puu läpi sisäjärjestyksessä ja tallennetaan puun solmut (osoittimet niihin) taulukkoon Tällöin solmut ovat taulukossa kasvavassa järjestyksessä Tehdään järjestyksessä keskimmäisestä solmusta uuden binääripuun juurisolmu Pienemmistä solmuista muodostetaan juurisolmun vasen alipuu (rekursiivisesti) Suuremmista solmuista muodostetaan juurisolmun oikea alipuu (rekursiivisesti) Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 18/30
Verkot Verkot ja graafit: Muodostuvat solmuista ja niitä yhdistävistä kaarista Tyypillisiä sovelluskohteita: Lyhimmän reitin etsiminen tieverkossa Raaka-aineiden virtausten mallintaminen tuotantoprosessissa Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 19/30
Suunnattu graafi Solmujen joukko N Kaarien joukko A Jokaisella kaarella a tarkalleen yksi alkusolmu t(a) ja yksi loppusolmu h(a) Jokaiseen kaareen täytyy kuulua alku- ja loppusolmu Solmuun ei tarvitse liittyä yhtään kaarta Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 20/30
Suunnattu graafi, naapurit Kuhunkin solmuun j liittyy kaksi kaarien joukkoa: Lähtevät kaaret A(j) Tulevat kaaret B(j) Näiden kaarien toisessa päässä olevat solmut ovat solmun j naapurisolmuja Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 21/30
Suunnattu graafi, polut Olkoon graafissa kaaret a 1, a 2,..., a k siten, että h(a i ) = t(a i+1 ) kaikilla i = 1,..., k 1 Silloin nämä kaaret muodostavat polun (reitin) Polku on yksinkertainen, jos mikään solmu ei toistu Polku on silmukka, jos alkusolmu t(a 1 ) on sama kuin loppusolmu h(a k ) Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 22/30
Suuntaamaton graafi Kaarilla ei ole suuntaa Molemmat suunnat tasa-arvoisia Suuntaamatonta kaarta sanotaan usein tieksi Suuntaamattomien graafien käsittely: Tielle annetaan nimellinen suunta Tie voidaan esittää kahtena suunnattuna kaarena Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 23/30
Yhtenäinen graafi, puu Graafi on yhtenäinen (yhdistetty), jos jokaisen solmuparin välillä on polku Jos graafi ei ole yhtenäinen, se muodostuu useammasta kuin yhdestä yhtenäisestä komponentista Puu tarkoittaa suuntaamatonta graafia, joka on yhtenäinen ja jossa ei ole yhtään silmukkaa Huom: Tässä yhteydessä hieman eri asia kuin edellä binääripuiden yhteydessä Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 24/30
Graafit ja verkot Graafi: Pelkästään solmuja ja kaaria Verkko: Solmuihin tai kaariin liittyy muitakin kuvauksia Esimerkiksi kaaren pituus: Polun pituus kaarien pituuksien summa Esimerkiksi kaaren kapasiteetti: Virtaus tapahtuu kaaren suuntaisesti Virtaus ei voi ylittää kapasiteettia Solmuun tulevien virtausten summa yhtä kuin solmusta lähtevien virtausten summa (Kirchhoffin laki) Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 25/30
Kaaritaulukko Taulukko verkon kaarista (jossain järjestyksessä) Jokaisesta kaaresta tallennettu alkusolmu, loppusolmu ja muut tiedot, kuten esimerkiksi pituus Hyvin yksinkertainen tallennusrakenne Vaatii muistitilaa vakion verran jokaista kaarta kohden Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 26/30
Verkon lyhimmät polut Suunnattu verkko, jossa jokaisella kaarella k on pituus l(k) Pituus voi olla myös negatiivinen Mutta verkossa ei saa olla silmukkaa, jonka pituus on negatiivinen Tehtävänä etsiä lyhimmät polut jostain annetusta solmusta verkon muihin solmuihin Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 27/30
Verkon lyhimmät polut Fordin ja Fulkersonin menetelmä: Yleinen, yksinkertainen menetelmä Riittää yksinkertainen verkon tallennusrakenne, kuten kaaritaulukko Annettu lähtösolmu a d(i) = lyhimmän tähän mennessä tunnetun polun pituus lähtösolmusta solmuun i t(i) = vastaavan polun viimeisen kaaren alkusolmu (solmua i edeltävä solmu polulla) Periaate: Tutkitaan jokaisen kaaren kohdalla, lyhenisikö polun pituus, jos kaari otettaisiin mukaan polkuun Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 28/30
Fordin ja Fulkersonin menetelmä 1. Alustus: Asetetaan d(a) = 0 ja t(a) = a Asetetaan d(i) = (suuri luku) kaikilla muilla solmuilla 2. Käsitellään kaikki kaaret jossain järjestyksessä: Vuorossa oleva kaari k, jonka alkusolmu i, loppusolmu j ja pituus l(k) Jos d(i) + l(k) < d(j), asetetaan d(j) = d(i) + l(k) ja t(j) = i 3. Jos jokin d(j) muuttui, toistetaan kohdasta 2, muuten lopetetaan Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 29/30
Fordin ja Fulkersonin menetelmä Algoritmin päätyttyä: d(j) = lyhimmän polun pituus lähtösolmusta solmuun j t(j) = vastaavan polun viimeisen kaaren alkusolmu Koko lyhin polku voidaan konstruoida kulkemalla polkua takaperin solmusta j lähtösolmuun a Jos solmuun j ei johda reittiä alkusolmusta, niin d(j) = Algoritmit 1 Kevät 2017 Luento 8 Ke 1.2.2017 30/30