Algoritmit 2 Luento 10 To 11.4.2019 Timo Männikkö
Luento 10 Merkkitiedon tiivistäminen LZW-menetelmä Taulukointi Editointietäisyys Peruutusmenetelmä Osajoukon summa Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 2/30
Merkkitiedon tiivistäminen Vakiopituinen koodi: Jokainen merkki esitetään samalla määrällä bittejä Esimerkiksi 8 bittiä (yksi tavu) Sama tallennustila riippumatta merkkitiedon sisällöstä Vaihtelevan pituinen koodi: Usein esiintyvillä merkeillä lyhyempi koodi, harvoin esiintyvillä pidempi koodi Esimerkiksi Huffmanin koodaus Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 3/30
LZW-menetelmä Lempel-Ziv-Welch Osamerkkijonoja muunnetaan numeerisiksi koodeiksi Kuvaus osamerkkijonojen ja niitä vastaavien koodien välillä esitetään hakemistossa Hakemistoa muodostetaan dynaamisesti sitä mukaa kuin tiedon pakkaaminen tai pakatun tiedon purkaminen etenee Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 4/30
LZW-menetelmä: Koodaus Tiivistettävä merkkijono m Aluksi jokaiselle esiintyvälle merkille kiinnitetään oma koodinsa Koodit ja vastaavat merkit lisätään hakemistoon Käydään läpi merkkijonoa alusta loppuun vaiheittain Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 5/30
LZW-menetelmä: Koodaus Haetaan m:n koodaamattoman osan alusta pisin osamerkkijono, joka sillä hetkellä löytyy hakemistosta Tämä osamerkkijono koodataan kyseisellä koodilla Hakemistoon lisätään uusi osamerkkijono, jolle kiinnitetään seuraava vapaana oleva koodi Uusi osamerkkijono: Juuri koodatun osamerkkijonon perään liitetään merkkijonon m seuraava merkki eli ensimmäinen merkki, jota ei ole koodattu vielä tässä vaiheessa Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 6/30
Esimerkki xxxyyyyyyxxyxxyx 0 1 x y x xxyyyyyyxxyxxyx 0 0 1 2 x y xx xxx yyyyyyxxyxxyx 02 0 1 2 3 x y xx xxy Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 7/30
Esimerkki jatkuu xxxy yyyyyxxyxxyx 021 0 1 2 3 4 x y xx xxy yy xxxyyy yyyxxyxxyx 0214 0 1 2 3 4 5 x y xx xxy yy yyy xxxyyyyyy xxyxxyx 02145 0 1 2 3 4 5 6 x y xx xxy yy yyy yyyx Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 8/30
Esimerkki jatkuu xxxyyyyyyxxy xxyx 021453 0 1 2 3 4 5 6 7 x y xx xxy yy yyy yyyx xxyx xxxyyyyyyxxyxxyx 0214537 0 1 2 3 4 5 6 7 x y xx xxy yy yyy yyyx xxyx Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 9/30
LZW-menetelmä: Koodin purkaminen Aluksi hakemistossa on vain yksittäiset merkit ja niitä vastaavat koodit Huom: Koko hakemistoa ei tunneta, vaan se muodostuu purkamisen yhteydessä Käydään läpi koodattua merkkijonoa koodi kerrallaan, ja kunkin koodin kohdalla etsitään sitä hakemistosta Kaksi mahdollisuutta: Käsiteltävänä oleva koodi on jo hakemistossa Käsiteltävänä olevaa koodia ei vielä ole hakemistossa Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 10/30
LZW-menetelmä: Koodin purkaminen Merkintä teksti[i] tarkoittaa koodia i vastaavaa osamerkkijonoa hakemistossa Merkintä teksti[i][1] tarkoittaa koodia i vastaavan osamerkkijonon ensimmäistä merkkiä Olkoon k käsiteltävänä oleva koodi Olkoon j koodia k edeltävä koodi Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 11/30
LZW-menetelmä: Koodin purkaminen Jos k löytyy hakemistosta: Vastaava osamerkkijono teksti[k] saadaan hakemistosta Lisätään hakemistoon uusi osamerkkijono teksti[j] + teksti[k][1], jolle kiinnitetään seuraava vapaana oleva koodi Jos k ei löydy hakemistosta: Vastaava osamerkkijono on teksti[j] + teksti[j][1] Lisätään tämä osamerkkijono hakemistoon ja kiinnitetään sille koodi k Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 12/30
Esimerkki 0214537 0 1 x y 0 214537 x 0 1 x y 02 14537 xxx 0 1 2 x y xx Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 13/30
Esimerkki jatkuu 021 4537 xxxy 0 1 2 3 x y xx xxy 0214 537 xxxyyy 0 1 2 3 4 x y xx xxy yy 02145 37 xxxyyyyyy 0 1 2 3 4 5 x y xx xxy yy yyy Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 14/30
Esimerkki jatkuu 021453 7 xxxyyyyyyxxy 0 1 2 3 4 5 6 x y xx xxy yy yyy yyyx 0214537 xxxyyyyyyxxyxxyx 0 1 2 3 4 5 6 7 x y xx xxy yy yyy yyyx xxyx Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 15/30
Algoritmien suunnittelu Taulukointi (dynaaminen optimointi): Tehtävä ratkaistaan vaiheittain, osatehtävä kerrallaan Aloitetaan pienemmistä ja yksinkertaisimmista osatehtävistä Ratkaisut tallennetaan taulukkoon Taulukon avulla muodostetaan yhä isompien osatehtävien ratkaisut Lopulta saadaan alkuperäisen tehtävän ratkaisu Käytetään usein tehtäville, jotka ovat luonteeltaan kombinatorisia Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 16/30
Editointietäisyys Merkkijonot x = a 1 a 2... a m ja y = b 1 b 2... b n Sallittuja editointioperaatioita yhden merkin lisäys (mihin tahansa kohtaan) ja yhden merkin poisto (mistä tahansa tahansa kohtaa) Merkkijonojen x ja y välinen editointietäisyys on pienin määrä operaatioita, joka tarvitaan x:n muuntamisessa y:ksi Esimerkki: AUTO AUT AU ASU ASUA Editointietäisyys 4 Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 17/30
Editointietäisyys Taulukko d[0..m][0..n], johon edintointietäisyydet lasketaan d[i][j] = merkkijonojen a 1 a 2... a i ja b 1 b 2... b j välinen editointietäisyys i = 0 tarkoittaa, että ensin mainittu merkkijono on tyhjä j = 0 tarkoittaa, että jälkimmäinen merkkijono on tyhjä d[m][n] = alkuperäisten merkkijonojen x ja y välinen editointietäisyys Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 18/30
Editointietäisyys Merkkijono a 1 a 2... a i tyhjäksi merkkijonoksi Kaikki merkit poistetaan d[i][0] = i Tyhjä merkkijono merkkijonoksi b 1 b 2... b j Kaikki merkit lisätään d[0][j] = j Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 19/30
Editointietäisyys Jos a i = b j Viimeisiä merkkejä ei tarvitse muuttaa d[i][j] = d[i 1][j 1] Jos a i b j Ensin poistetaan a i, sitten a 1 a 2... a i 1 b 1 b 2... b j d[i][j] = d[i 1][j] + 1 Ensin a 1 a 2... a i b 1 b 2... b j 1, sitten lisätään b j d[i][j] = d[i][j 1] + 1 Valitaan näistä pienempi Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 20/30
Editointietäisyys 1. for (i = 0; i <= m; i++) d[i][0] = i; 2. for (j = 0; j <= n; j++) d[0][j] = j; 3. for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { if (a[i] == b[j]) d[i][j] = d[i-1][j-1]; else d[i][j] = min(d[i-1][j] + 1, d[i][j-1] + 1); } } 4. return d[m][n]; Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 21/30
Editointietäisyys Kaksi sisäkkäistä silmukkaa Ulompi silmukka suoritetaan m kertaa, sisempi n kertaa Aikavaativuus Θ(mn) Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 22/30
Algoritmien suunnittelu Raa an voiman käyttö: Tutkitaan kaikki mahdolliset ratkaisuvaihtoehdot Nopeuttaminen: Rajataan pois vaihtoehdot, joiden joukosta ei voi enää löytyä parempaa ratkaisua Peruutus: Täydennetään ratkaisua tekemällä valintoja Perutaan huonoiksi osoittautuneita valintoja Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 23/30
Peruutusmenetelmä Aloitetaan tyhjästä osittaisvastauksesta Yritetään täydentää osittaisvastausta vaiheittain komponentti kerrallaan Jos täydentäminen voidaan tehdä rikkomatta tehtävän rajoituksia, se suoritetaan Jos saadaan täydellinen vastaus, voidaan lopettaa Jos täydentämistä ei voida tehdä, perutaan viimeksi tehty täydennys ja yritetään toista komponenttia Jos komponentteja ei ole jäljellä, peruutetaan edelleen Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 24/30
Peruutusmenetelmä vastaus peruuttava(vastaus x) { if (x on täydellinen vastaus) return x; else { for (kaikilla täydennyksillä e[i]) { y = peruuttava(x + täydennys e[i]); if (y on täydellinen vastaus) return y; } return x ilman täydennystä; } } Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 25/30
Osajoukon summa Joukko A = {a 1, a 2,..., a n }, missä a i :t positiivisia kokonaislukuja Annettu positiivinen kokonaisluku d Tehtävä: Etsi sellainen joukon A osajoukko S, jonka alkioiden summa on täsmälleen d (jos olemassa) Joukossa n alkiota Osajoukkoja 2 n kpl (mukaan lukien tyhjä joukko ja joukko A itse) Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 26/30
Osajoukon summa Ratkaiseminen peruutusmenetelmällä: Järjestetään alkiot kasvavaan suuruusjärjestykseen: a 1 a 2 a n Valitaan alkioita ratkaisuun tässä järjestyksessä Pidetään yllä valittujen alkioiden summaa Vaiheessa i seuraava alkio a i joko valitaan mukaan (summa kasvaa vastaavasti) tai ei valita mukaan (summa ei muutu) (Jatkuu) Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 27/30
Osajoukon summa (Jatkuu) Ennen kuin jatketaan vaiheeseen i + 1, peruutetaan: Jos on edetty jo vaiheeseen i > n Jos summa jäisi alle d:n, vaikka kaikki jäljellä olevat alkiot valittaisiin mukaan Jos alkion a i valitseminen veisi summan yli d:n Jos alkion a i valitseminen antaisi summaksi tasan d: Ratkaisu on löytynyt Otetaan a i mukaan ratkaisuun ja palataan edelliseen vaiheeseen Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 28/30
Osajoukon summa osasumma(a, d, i, summa, n) { if (i > n) return false; if (summa + a[i] +... + a[n] < d) return false; if (summa + a[i] > d) return false; if (summa + a[i] == d) { lisätään alkio a[i] ratkaisuun; return true; } if (osasumma(a, d, i+1, summa+a[i], n)) { lisätään alkio a[i] ratkaisuun; return true; } else return osasumma(a, d, i+1, summa, n); } Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 29/30
Osajoukon summa Algoritmin ensimmäinen kutsu: osasumma(a, d, 1, 0, n) Algoritmi löytää halutunlaisen osajoukon, jos sellainen on olemassa Pahimmassa tapauksessa käydään läpi kaikki mahdolliset osajoukot Θ(2 n ) Algoritmit 2 Kevät 2019 Luento 10 To 11.4.2019 30/30