Algoritmit 2. Luento 9 Ti Timo Männikkö

Samankaltaiset tiedostot
Algoritmit 2. Luento 10 To Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 2. Luento 8 Ke Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 2. Luento 11 Ti Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 13 Ti Timo Männikkö

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen)

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 12 To Timo Männikkö

Datatähti 2019 loppu

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 8 To Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö

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

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 12 Ke Timo Männikkö

Ongelma 1: Onko datassa tai informaatiossa päällekkäisyyttä?

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

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

Algoritmit 1. Luento 9 Ti Timo Männikkö

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

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

10. Painotetut graafit

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

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen)

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Luku 8. Aluekyselyt. 8.1 Summataulukko

Algoritmit 2. Luento 10 To Timo Männikkö

Algoritmit 2. Luento 11 Ti Timo Männikkö

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmi on periaatteellisella tasolla seuraava:

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

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.

4. Joukkojen käsittely

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 14 To Timo Männikkö

58131 Tietorakenteet ja algoritmit (syksy 2015)

Algoritmit 1. Luento 4 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

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

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

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

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

Algoritmit 1. Luento 14 Ke Timo Männikkö

13 Lyhimmät painotetut polut

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

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

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

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

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Binäärihaun vertailujärjestys

1.1 Tavallinen binäärihakupuu

4.3. Matemaattinen induktio

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

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö

Tietorakenteet ja algoritmit

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

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

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

A TIETORAKENTEET JA ALGORITMIT

Johdatus graafiteoriaan

10. Painotetut graafit

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Algoritmit 1. Luento 1 Ti Timo Männikkö

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

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

Ei-yhteydettömät kielet [Sipser luku 2.3]

v 8 v 9 v 5 C v 3 v 4

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

14 Tasapainotetut puurakenteet

Transkriptio:

Algoritmit 2 Luento 9 Ti 17.4.2018 Timo Männikkö

Luento 9 Merkkitiedon tiivistäminen Huffmanin koodi LZW-menetelmä Taulukointi Editointietäisyys Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 2/29

Merkkitiedon tiivistäminen Vakiopituinen koodi: Jokainen merkki vie saman määrän tilaa Esimerkiksi 8 bittiä (yksi tavu) 100 merkkiä vie tilaa 800 bittiä Jos tallennettavien merkkien joukossa esiintyy vain pieni osa kaikista mahdollisista merkeistä, lyhyempikin koodi riittäisi Esimerkiksi neljä eri merkkiä voitaisiin esittää 2 bitillä (00, 01, 10, 11) 100 merkkiä vie tilaa 200 bittiä Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 3/29

Merkkitiedon tiivistäminen Vaihtelevan pituinen koodi: Usein esiintyvillä merkeillä lyhyempi koodi, harvoin esiintyvillä pidempi koodi Merkkijonoja korvataan numeerisilla koodeilla: Esimerkiksi RLE-koodaus (Run-Length Encoding) Saman merkin muodostamat ketjut korvataan laskurilla Tekstissä 200 kappaletta a-kirjaimia, 300 kappaletta b-kirjaimia 200a300b Bittikarttakuvassa peräkkäisiä valkoisia ja mustia pikseleitä 25W5B50W10B Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 4/29

Merkkitiedon tiivistäminen Eri merkeillä eri pituiset koodit Ongelma: Mihin bittiin edellinen merkki päättyy ja mistä bitistä seuraava merkki alkaa? Eräs ratkaisu: Prefiksi- eli etuliitekoodit Minkään merkin koodi ei ole sama kuin jonkin toisen koodin alkuosa Käydään bittejä läpi järjestyksessä kunnes saadaan valmiiksi yhtä merkkiä vastaava koodi Seuraavan merkin koodi alkaa heti seuraavasta bitistä Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 5/29

Huffmanin koodaus Koodit muodostetaan binääripuun avulla Kukin lehtisolmu vastaa yhtä merkkiä Haarautuminen vasempaan alipuuhun tarkoittaa 0-bittiä, haarautuminen oikeaan alipuuhun 1-bittiä Polku juurisolmusta lehtisolmuun vastaa kyseisen merkin koodia Puu muodostetaan merkkien esiintymistiheyksien mukaan Lyhimmät koodit liitetään merkkeihin, joiden esiintymistiheys on suurin Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 6/29

Huffmanin koodaus: Esimerkki Esiintymistiheydet: Koodit: a i s t 20 75 3 2 a i s t 11 0 100 101 Kaikkien 100 merkin tallennus vie 130 bittiä 100 0 1 75 25 i 0 1 5 20 0 1 a 3 s 2 t Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 7/29

Huffmanin koodaus Binääripuulle määritellään painoarvo Alkutilanteessa jokaista erilaista merkkiä vastaa yhden solmun kokoinen puu, jonka painoarvoksi asetetaan merkin esiintymistiheys Valitaan kaksi painoarvoiltaan pienintä puuta ja yhdistetään ne yhdeksi puuksi Muodostetaan uusi juurisolmu Yhdistettävät puut liitetään sen lapsiksi Tämän puun painoarvoksi asetetaan yhdistettävien puiden painoarvojen summa Näin jatketaan kunnes jäljellä on vain yksi puu Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 8/29

Huffmanin koodaus Esiintyvät merkit c 1, c 2,..., c n Esiintymistiheydet f 1, f 2,..., f n 1. Alustus: Muodostetaan merkkejä c i vastaavat puut Asetetaan puiden painoarvoiksi w i = f i 2. Toistetaan kunnes jäljellä on yksi puu: Valitaan puut u ja v siten, että w u ja w v ovat pienimmät Muodostetaan uusi juurisolmu s Liitetään u sen vasemmaksi lapseksi ja v oikeaksi lapseksi Asetetaan puun painoarvoksi w s = w u + w v Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 9/29

Huffmanin koodaus Painoarvojen käsittelyssä voidaan käyttää apuna prioriteettijonoa Aluksi kaikki n painoarvoa tallennetaan prioriteettijonoon Jokaisella kierroksella poistetaan kaksi painoarvoa ja tilalle tallennetaan yksi painoarvo Prioriteettijonon koko pienenee yhdellä joka kierroksella Prioriteettijonon perusoperaatiot Θ(log n) (jos toteutettu tasapainoisena binääripuuna tai kekona) Koodien muodostaminen Θ(n log n) Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 10/29

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 2018 Luento 9 Ti 17.4.2018 11/29

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 2018 Luento 9 Ti 17.4.2018 12/29

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 2018 Luento 9 Ti 17.4.2018 13/29

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 2018 Luento 9 Ti 17.4.2018 14/29

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 2018 Luento 9 Ti 17.4.2018 15/29

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 2018 Luento 9 Ti 17.4.2018 16/29

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 2018 Luento 9 Ti 17.4.2018 17/29

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 2018 Luento 9 Ti 17.4.2018 18/29

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 2018 Luento 9 Ti 17.4.2018 19/29

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 2018 Luento 9 Ti 17.4.2018 20/29

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 2018 Luento 9 Ti 17.4.2018 21/29

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 2018 Luento 9 Ti 17.4.2018 22/29

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 2018 Luento 9 Ti 17.4.2018 23/29

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 2018 Luento 9 Ti 17.4.2018 24/29

Editointietäisyys Taulukko d[0..m][0..n], johon edintointietäisyydet lasketaan d[i][j] = merkkijonojen a 1... a i ja b 1... 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 2018 Luento 9 Ti 17.4.2018 25/29

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 2018 Luento 9 Ti 17.4.2018 26/29

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 2018 Luento 9 Ti 17.4.2018 27/29

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 2018 Luento 9 Ti 17.4.2018 28/29

Editointietäisyys Kaksi sisäkkäistä silmukkaa Ulompi silmukka suoritetaan m kertaa, sisempi n kertaa Aikavaativuus Θ(mn) Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 29/29