Algoritmit 2 Luento 8 Ke 13.4.2016 Timo Männikkö
Luento 8 Rekursioyhtälöt Master-lause Lähin pistepari Ahne menetelmä Lyhin virittävä puu Kruskalin menetelmä Primin menetelmä Merkkitiedon tiivistäminen Huffmanin koodi Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 2/31
Rekursiiviset algoritmit Algoritmin kutsu annetulla ongelmalla: Jos pieni yksinkertainen ongelma Ratkaistaan se ja palautetaan ratkaisu Muutoin jaetaan ongelma pienempiin vastaavanlaisiin ongelmiin Ratkaistaan ne rekursiivisilla kutsuilla Muodostetaan pienempien ongelmien ratkaisuista tämän kutsun ongelman ratkaisu Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 3/31
Rekursioyhtälöt Tehtävä, jonka koko on n, jaetaan a:han osatehtävään, joiden koko on n/b Osatehtävät ratkaistaan rekursiivisesti Lisäksi muu aika: Tehtävien muodostaminen, tulosten kokoaminen Rekursioyhtälö { c 1, kun n = 1 T (n) = at (n/b) + d(n), kun n = b k, k 1 Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 4/31
Master-lause Rekursioyhtälön { c 1, kun n = 1 T (n) = at (n/b) + cn α, kun n = b k, k 1 ratkaisun kertaluokka on Θ(n log b a ), jos a > b α tai c = 0 Θ(n α ), jos a < b α ja c 0 Θ(n α log b n), jos a = b α ja c 0 Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 5/31
Lähin pistepari Tason pisteet p i = (x i, y i ), i = 1, 2,..., n Pisteiden välinen etäisyys: d(p i, p j ) = (x i x j ) 2 + (y i y j ) 2 Tehtävä: Etsi kaksi toisiaan lähinnä olevaa pistettä Raa an voiman algoritmi: Käydään läpi kaikki pisteparit, lasketaan niiden välinen etäisyys ja pidetään yllä pienintä etäisyyttä Θ(n 2 ) Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 6/31
Lähin pistepari Ratkaisu osittamalla: Jos n pieni, käytetään raa an voiman algoritmia Muuten jaetaan pisteet kahteen suunnilleen yhtäsuureen osaan S 1 ja S 2 Selvitetään lähin pistepari joukossa S 1 Selvitetään lähin pistepari joukossa S 2 Selvitetään lähin pistepari, jossa toinen pisteistä on joukossa S 1 ja toinen joukossa S 2 Valitaan lähin pistepari kolmesta edellä esitetystä parista Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 7/31
Lähin pistepari Joukot S 1 ja S 2 käsitellään rekursiivisesti Kolmannen pisteparin selvittäminen riippuu siitä, miten jako joukkoihin on tehty Esimerkiksi: Jaetaan y-akselin suuntaisella viivalla, joka kulkee mediaanipisteen kautta, kun pisteet järjestetty x-koordinaatin mukaan kasvavaan järjestykseen Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 8/31
Lähin pistepari d 1 = pienin etäisyys S 1 :ssä d 2 = pienin etäisyys S 2 :ssä d = min{d 1, d 2 } S 1 = ne S 1:n pisteet, joiden etäisyys jakoviivasta d S 2 = ne S 2:n pisteet, joiden etäisyys jakoviivasta d Kolmannen pisteparin selvittämiseksi riittää tutkia joukot S 1 ja S 2 d 1 S 1 S 2 d d 2 d Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 9/31
Lähin pistepari Olkoon a S 1 ja b S 2 siten, että niiden välinen etäisyys d Myös a:n ja b:n välinen pystysuora etäisyys d Jokaista nauhassa olevaa pistettä kohti riittää tutkia laatikko, jonka korkeus on d Laatikossa voi olla korkeintaan 8 pistettä Etäisyysvertailuja Θ(n) a d b d d Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 10/31
Lähin pistepari T (n) = { c 1, kun n = 1 2T (n/2) + cn, kun n > 1 a = 2, b = 2, α = 1, c 0 Master-lauseen kolmas kohta T (n) = Θ(n log 2 n) Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 11/31
Algoritmien suunnittelu Ahne menetelmä: Tehdään vaiheittain valintoja Valitaan aina se vaihtoehto, joka sillä hetkellä näyttää parhaalta Tehtyjä valintoja ei pureta myöhemmin Joskus ahne algoritmi antaa optimaalisen ratkaisun Mutta usein saadaan vain likiarvoratkaisu Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 12/31
Ahne menetelmä vastaus ahne(tapaus x) { y = 0; // "Tyhjä osittaisvastaus" while (y ei ole täydellinen vastaus) { valitse mahdollisista täydennyksistä e[1],...,e[k] sellainen e[i], että osittaisvastaus y täydennettynä e[i]:llä antaa "suurimman arvon" if (y:n täydentäminen ei mahdollista) return fail; else täydennä osittaisvastausta y täydennyksellä e[i] } return y; } Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 13/31
Lyhin virittävä puu Yhtenäinen, suuntaamaton verkko G Solmujen joukko N, teiden joukko E Jokaiseen tiehen (i, j) liittyy pituus l(i, j) Verkon virittävä puu on aliverkko, joka yhdistää verkon kaikki solmut ja jossa ei ole yhtään silmukkaa Virittävän puun pituus on siihen kuuluvien teiden pituuksien summa Tehtävä: Selvitä verkon lyhin virittävä puu Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 14/31
Lyhin virittävä puu Monet ahneet algoritmit perustuvat tulokseen: Olkoon U jokin N:n aito osajoukko Olkoon (u, v) lyhyin teistä, joiden toinen päätesolmu on U:ssa ja toinen N \ U:ssa Silloin on olemassa lyhin virittävä puu, joka sisältää tien (u, v) Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 15/31
Lyhin virittävä puu Tuloksen todistus: Olkoon T verkon lyhin virittävä puu Jos (u, v) / T, sen lisääminen aiheuttaa silmukan On olemassa jokin toinen tie, jonka toinen päätesolmu on U:ssa ja toinen N \ U:ssa Poistetaan tämä tie T :stä ja lisätään (u, v) sen tilalle Saadaan virittävä puu, jonka pituus on alkuperäisen T :n pituus Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 16/31
Lyhin virittävä puu Kruskalin menetelmä: Aloitetaan triviaalilla virittävällä metsällä: Jokainen solmu muodostaa yhden puun Siis metsä (N, T ), missä T = Yhdistetään puita teillä ahneeseen tyyliin, kunnes tuloksena on yksi yhtenäinen puu Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 17/31
Kruskalin menetelmä joukko Kruskal(N,E) // Oletetaan, että verkko on yhtenäinen { S = E; // kaikki tiet T = tyhjä joukko; while (T ei muodosta virittävää puuta) { valitse lyhin tie (u,v) joukosta S; poista tie (u,v) joukosta S; if (tie (u,v) ei aiheuta silmukkaa T:ssä) lisää tie (u,v) joukkoon T; } return T; } Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 18/31
Kruskalin menetelmä: Esimerkki 3 15 7 8 10 12 4 X X Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 19/31
Lyhin virittävä puu Primin menetelmä: Aluksi joukossa U on yksi solmu Etsitään lyhin tie (u, v) siten, että u U ja v N \ U Lisätään tie (u, v) lyhimpään virittävään puuhun T Lisätään solmu v joukkoon U Jatketaan kunnes kaikki solmut ovat joukossa U Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 20/31
Primin menetelmä joukko Prim(N,E) // Oletetaan, että verkko on yhtenäinen { U = {aloitussolmu}; T = tyhjä joukko; while (U ei sisällä kaikkia solmuja) { valitse lyhin tie (u,v), jolla u on U:ssa ja v ei ole U:ssa; lisää tie (u,v) joukkoon T; lisää solmu v joukkoon U; } return T; } Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 21/31
Primin menetelmä: Esimerkki 3 15 7 8 10 12 4 Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 22/31
Primin menetelmä Solmuja n kpl, kierroksia n 1 kpl Joka kierroksella etsitään lyhin tie (u, v) Jos jokaiselle N \ U:n solmulle pidetään yllä lyhimmän tien pituutta U:hun, voidaan (u, v) löytää ajassa Θ(n) Θ(n 2 ) Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 23/31
Merkkitiedon tiivistäminen ASCII-koodi: Jokainen merkki esitetään 8 bitillä Esimerkiksi 100 merkkiä vie tilaa 800 bittiä riippumatta siitä, mitä merkkejä esiintyy Jos esiintyviä merkkejä on vähemmän, lyhyempikin koodi riittäisi Esimerkiksi neljä eri merkkiä voidaan esittää 2 bitillä (00, 01, 10, 11) Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 24/31
Merkkitiedon tiivistäminen Vaihtelevan pituinen koodi: Usein esiintyville merkeille lyhyempi koodi, harvoin esiintyville pidempi koodi Ongelma: Mistä tiedetään, miten monta bittiä kuhunkin koodiin kuuluu Yksi ratkaisu: Prefiksi- eli etuliitekoodit Mikään koodi ei ole sama kuin jonkin toisen koodin alkuosa Koodia tulkittaessa edetään niin pitkälle kuin jokin koodi saadaan valmiiksi Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 25/31
Huffmanin koodi Esitetään koodit binääripuun avulla Haarautuminen vasemmalle tarkoittaa 0-bittiä, haarautuminen oikealle 1-bittiä Lehtisolmut vastaavat merkkejä Polku juurisolmusta lehtisolmuun vastaa kyseisen merkin koodia Puu rakennetaan merkkien esiintymisfrekvenssien mukaan Lyhyimmät koodit liitetään merkkeihin, joiden frekvenssi suurin Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 26/31
Esimerkki Esiintymisfrekvenssit: Koodit: a i s t 20 75 3 2 a i s t 11 0 100 101 0 1 i 0 1 0 1 a Kaikkien 100 merkin tallennus vie 130 bittiä s t Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 27/31
Huffmanin koodi Aluksi jokainen merkki muodostaa oman yhden solmun kokoisen puun Jokaisella puulla on painoarvo Aluksi painoarvot ovat merkkien frekvenssit Yhdistetään kaksi painoarvoltaan pienintä puuta lisäämällä ne uuden juurisolmun alipuiksi Yhdistetyn puun painoarvoksi tulee alipuiden painoarvot Jatketaan kunnes jäljellä on vain yksi puu Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 28/31
Huffmanin koodi Esiintyvät merkit c 1, c 2,..., c n Esiintymisfrekvenssit f 1, f 2,..., f n 1. Jokaisesta c i yhden solmun puu, painot w i = f i 2. Toistetaan kunnes jäljellä yksi puu: Valitaan puut u ja v siten, että w u ja w v ovat pienimmät Uusi juurisolmu s Vasen lapsi u, oikea lapsi v Paino w s = w u + w v Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 29/31
Huffmanin koodi Painot voidaan tallentaa prioriteettijonoon Aluksi jonossa n alkiota Joka kierroksella jonosta poistetaan kaksi alkiota ja tilalle tulee yksi alkio Prioriteettijonon operaatiot Θ(log n) (jos toteutettu tasapainoisena binääripuuna tai kekona) Koodin muodostus Θ(n log n) Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 30/31
RLE-koodaus Run-Length Encoding Tutkitaan, sisältääkö merkkijono useita samoja merkkejä peräkkäin Jos sisältää, korvataan ne laskurilla, joka kertoo merkkien lukumäärän Esimerkki: aaaaabaaaaaaaaaaaabbbbbaabbbbbb 5a1b12a5b2a6b Algoritmit 2 Kevät 2016 Luento 8 Ke 13.4.2016 31/31