Kierros 6: Dynaaminen ohjelmointi ja ahneet algoritmit

Koko: px
Aloita esitys sivulta:

Download "Kierros 6: Dynaaminen ohjelmointi ja ahneet algoritmit"

Transkriptio

1 Kierros 6: Dynaaminen ohjelmointi ja ahneet algoritmit Tommi Junttila Aalto University School of Science Department of Computer Science CS-A1140 Data Structures and Algorithms Autumn 2017 Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

2 Materiaalia kirjassa Introduction to Algorithms, 3rd ed. (online via Aalto lib): Dynaaminen ohjelmointi: kappaleet 15.0, 15.1 ja 15.4 Ahneiden algoritmien perusteet: kappaleet 16.1 ja 16.2 Materiaalia muualla ja linkkejä: wikipedia-artikkeli dynaamisesta ohjelmoinnista wikipedia-artikkeli ahneista algoritmeista MIT Open Courseware video (videon toisen puoliskon lyhimpien polkujen algoritmeihin palataan myöhemmin kurssilla) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

3 Dynaaminen ohjelmointi Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

4 Dynaaminen ohjelmointi on yleinen algoritmien suunnitteluperiaate Se soveltuu monien optimointiongelmien ratkaisemiseen; näissä on tavoitteena löytää paras ratkaisu ongelmaan Lyhyesti ja karkeasti kuvattuna se on täydellinen rekursiivinen haku osaongelmien ratkaisujen tallentamisella täydennettynä Termi dynaaminen ohjelmointi johtuu historiallisista syistä, lue lisää esim. tästä wikipedia-artikkelista Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

5 Esimerkki I: Fibonaccin luvut Aloitetaan erittäin yksinkertaisella esimerkillä (tuttu jo edellisiltä kursseilta) Fibonaccin lukujono F n = 0,1,1,2,3,5,8,... määritellään rekursiivisesti kaavoilla F 0 = 0, F 1 = 1 ja F n = F n 1 + F n 2 for n 2 Lukujen laskeminen helppoa rekursiivisesti def f i b ( n : I n t ) : B i g I n t = { r e q u i r e ( n >= 0) i f ( n == 0) 0 else i f ( n == 1) 1 else f i b ( n 1) + f i b ( n 2) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

6 Kutsupuu laskettaessa arvoa fib(6): fib(6) fib(5) fib(4) fib(4) fib(3) fib(3) fib(2) fib(3) fib(2) fib(2) fib(1) fib(2) fib(1) fib(1) fib(0) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) fib(1) fib(0) fib(1) fib(0) Moni funktiokutsu esiintyy useasti kutsupuussa Toisin sanoen sama aliongelma fib(i) ratkaistaan monta kertaa Tämä heijastuu ajoaikaan: scala> measurecputime { f i b (45) res2 : ( BigInt, Double ) = ( , ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

7 Mikä on tämän rekursiivisen algoritmin ajoaika? Rekursioyhtälö jos oletetaan lukujen yhteenlaskun olevan vakioaikaista: T (n) = T (n 2) + T (n 1) +O(1) ja T (1) = T (0) = O(1) Saadaan helposti alarajoja: T (n) F n = ϕn ( 1 ϕ )n 5 = ϕn 5 ( ϕ 1 )n 5 = Ω(ϕ n ), missä ϕ = on kultainen leikkaus T (n) 2T (n 2) +O(1) ja siten T (n) = Ω(2 n/2 ) Algoritmin ajoaika on vähintään eksponentiaalinen Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

8 Tarkennetaan vielä hiukan analyysiä Itse asiassa lukujen yhteenlasku tässä ei ole vakioaikaista koska lukujen F n binääriesityksen pituus kasvaa lineaarisesti suhteessa arvoon n termin O(1) rekursioyhtälössä pitäisi olla Ω(n) Huomataan myös: n on funktion argumentin arvo, ei sen binääriesityksen pituus Jos funktiota fib kutsutaan m-bittisellä arvona n, niin ajoaika on Ω(ϕ 2m ) suhteessa syötteen kokoon m Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

9 Fibonaccin luvut dynaamisella ohjelmoinnilla Sen sijaan, että laskettaisiin arvoja fib(i) uudelleen ja uudelleen, tallennetaan jo lasketut arvot assosiatiiviseen kuvaukseen ja käytetään näitä aina kun mahdollista (engl. memoization) def f i b ( n : I n t ) : B i g I n t = { r e q u i r e ( n >= 0) val m = scala. c o l l e c t i o n. mutable.map[ I n t, B i g I n t ] ( ) def i n n e r ( i : I n t ) : B i g I n t = m. getorelseupdate ( i, { i f ( i == 0) 0 else i f ( i == 1) 1 else i n n e r ( i 1) + i n n e r ( i 2) ) i n n e r ( n ) Ajoaika parantuu huomattavasti scala> measurecputime { f i b (1000) res14 : ( BigInt, Double ) = (<A number with 209 d i g i t s >, ) Tämä osatulosten tallentaminen on dynaamisen ohjelmoinnin avainkomponentti Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

10 Kutsupuu arvolle fib(6) osatulosten tallentamisella: fib(6) fib(5) fib(4) fib(4) fib(3) fib(3) fib(2) fib(3) fib(2) fib(2) fib(1) fib(2) fib(1) fib(1) fib(0) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) fib(1) fib(0) fib(1) fib(0) Vihreät solmut kuvaavat kutsuja, joiden arvo löytyy jo tallennettuna ja joiden alikutsupuita (punaisella) ei siis käydä läpi lainkaan Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

11 Uuden version ajoaika? Erilaisten kutsukertojen lukumäärä kerrottuna kussakin kuluvalla ajalla Oletetaan vakioaikainen lukujen yhteenlasku ja haku/päivitys-operaatiot kuvauksilla 1 : n O(1) = O(n) Tässä analyysissa ei tarvittu rekursioyhtälöitä Otettaessa huomioon kahden Θ(n)-bittisen luvun yhteenlaskuun kuluva lineaarinen aika saadaan rekursioyhtälö Muistin käyttö? Θ(n 2 ) T (n) = T (n 1) + Θ(n) = Θ(n 2 ) 1 Kuten ollaan aiemmin nähty, haku/päivitys-operaatiot ovat kuvauksille Scalan Map-piirrettä käyttäessä itse asiassa O(logn) tai keskimäärin O(1), mutta tässä tapauksessa taulukoiden avulla päästäisiin vakioaikaan. Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

12 Rekursiivinen verio ei ole häntärekursiivinen ja voi siis kuluttaa kaiken pinomuistin ( stack overflow error ) Sama laskenta voidaan tehdä helposti myös iteratiivisesti alhaalta ylös (engl. bottom-up), alkaen arvosta fib(0) ja tallentaen tulokset taulukkoon def f i b ( n : I n t ) : B i g I n t = { r e q u i r e ( n >= 0) val m = new Array [ B i g I n t ] ( n+1 max 2) m( 0 ) = 0 m( 1 ) = 1 for ( i < 2 to n ) m( i ) = m( i 2) + m( i 1) m( n ) scala> measurecputime { f i b (1000) res17 : ( BigInt, Double ) = (<A number with 209 d i g i t s >, E 4) Taulukoille haku- ja päivitysoperaatiot ovat vakioaikaisia Muistin käyttö? Θ(n 2 ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

13 Itse asiassa tarvitsee muistaa vain kaksi edellistä arvoa saadaan muistin käyttöä pienemmäksi Aloitetaan arvoista F 0 ja F 1 ja jatketaan arvoon F n def f i b ( n : I n t ) : B i g I n t = { r e q u i r e ( n >= 0) i f ( n == 0) return 0 var fprev = B i g I n t ( 0 ) var f = B i g I n t ( 1 ) for ( i < 1 u n t i l n ) { val fnew = fprev + f fprev = f f = fnew return f scala> measurecputime { f i b (1000) res48 : ( BigInt, Double ) = (<A number with 209 d i g i t s >,6.0929E 4) Muistin käyttö? Θ(n) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

14 Sama funktionaalisella tyylillä def f i b ( n : I n t ) : B i g I n t = { r e q u i r e ( n >= 0) i f ( n == 0) 0 else (1 u n t i l n ). f o l d L e f t [ ( B i g I n t, B i g I n t ) ] ( 0, 1 ) ( {case ( ( fprev, f ), i ) => ( f, fprev+ f ) ). 2 Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

15 Ongelman ratkaiseminen dynaamisella ohjelmoinnilla 1 Määritellään (optimaalinen) ratkaisu (optimaalisten) osaratkaisujen avulla Tuloksena (optimaalisen) ratkaisun rekursiivinen määritelmä Fibonaccin lukujen esimerkissä ei ole optimaalisuuden vaatimusta ja rekursiivinen määritelmä oli jo valmiiksi annettuna 2 Tarkastellaan, esiintyvätkö osaratkaisut useaan kertaan rekursiivisessa kutsupuussa 3 Jos esiintyvät, käytetään osaratkaisujen tallentamista tai tehdään iteratiivinen versio, joka tuottaa osaratkaisut taulukkoon 2 2 Jos eivät esiinny, niin osaongelmat eivät limity ja dynaaminen ohjelmointi ei toimi. Joskus voi olla mahdollista tehdä ongelmalle toisenlainen rekursiivinen määritelmä, jossa osaongelmat limittyvät. Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

16 Esimerkki II: Tangon leikkaaminen Nyt rekursiivista määritelmää ei ole annettu valmiina vaan se joudutaan keksimään Tarkastellaan seuraavaa optimointiongelmaa: Annettuna materiaalitanko, jonka pituus on n yksikköä sekä taulukko (p 1,...,p n ) hintoja, jossa jokainen hinta p i määrää rahasumman, joka saadaan myymällä i yksikön mittainen pala tangosta. Tangon leikkaaminen paloihin on ilmaista. Mikä on paras tapa leikata tanko paloihin niin, että saadaan paras kokonaistuotto? Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

17 Esimerkki Jos tangon pituus alussa on 4 ja hinnat ovat 2 rahayksikköä tangonpaloille, joiden pituus on 1, 4 rahayksikköä tangonpaloille, joiden pituus on 2, 7 rahayksikköä tangonpaloille, joiden pituus on 3 ja 8 rahayksikköä tangonpaloille, joiden pituus on 4. Tuottavin tapa leikata tanko paloihin on tehdä yksi 1 yksikön pala ja yksi 3 yksikön pala. Näiden myyminen tuottaa 9 rahayksikköä. Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

18 Optimaalisen ratkaisun rekursiivinen määrittely Kuinka leika n yksikön tanko paloihin parhaalla tavalla? Olkoon maksimituotto s(n) s(n) on suurin seuraavista: Leikataan pois 1 yksikön pala ja sen jälkeen leikataan jäljelle jäävä n 1 mittainen tanko parhaalla tavalla tuotto on p 1 + s(n 1) Leikataan pois 2 yksikön pala ja sen jälkeen leikataan jäljelle jäävä n 2 mittainen tanko parhaalla tavalla tuotto on p 2 + s(n 2)... Leikataan pois n 1 yksikön pala ja sen jälkeen leikataan jäljelle jäävä 1 mittainen tanko parhaalla tavalla tuotto on p n 1 + s(1) Ei tehdä leikkauksia, tuotto on p n s(n) on siis s(n) = max i=1,...,n (p i + s(n i)) missä s(0) = 0, jotta saadaan viimeinen ei leikkauksia -tapaus hoidettua yhtenäisellä tavalla Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

19 Rekursiivisen määrittelyn avulla ongelman ratkaisevan ohjelman toteutus on suoraviivaista Scala-kielellä def cut ( n : I n t, p r i c e s : Array [ I n t ] ) = { r e q u i r e ( prices. length >= n+1) r e q u i r e ( p r i c e s ( 0 ) == 0 && p r i c e s. f o r a l l ( >= 0) ) def i n n e r ( k : I n t ) : Long = { i f ( k == 0) 0 else { var best : Long = 1 for ( i < 1 to k ) best = best max ( p r i c e s ( i ) + i n n e r ( k i ) ) best i n n e r ( n ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

20 Sama funktionaalisella tyylillä def cut ( n : I n t, p r i c e s : Array [ I n t ] ) = { r e q u i r e ( prices. length >= n+1) r e q u i r e ( p r i c e s ( 0 ) == 0 && p r i c e s. f o r a l l ( >= 0) ) def i n n e r ( k : I n t ) : Long = { i f ( k == 0) 0 else (1 to k ). i t e r a t o r.map( i => p r i c e s ( i ) + i n n e r ( k i ) ). max i n n e r ( n ) Miksi yllä on käytetty iteraattoria? Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

21 Kutsupuu kun n = 4 cut(4, prices) inner(4) inner(3) inner(2) inner(1) inner(0) inner(2) inner(1) inner(0) inner(1) inner(0) inner(0) inner(1) inner(0) inner(0) inner(0) inner(0) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

22 Ajoaika? Kun tangon pituus on n, niin leikkauksia voidaan tehdä n 1 kohdasta on olemassa 2 n 1 tapaa leikata tanko koska algoritmi käy läpi jokaisen, sen ajoaika on Θ(2 n ) Voitaisiin parantaa rekursiivista ratkaisua ottamalla ensin kaikki yhden yksikön leikkaukset, sitten kahden yksikön jne. Tällä menettelyllä eri tapoja leikata tanko on sama määrä kuin tapoja osittaa luonnollinen luku n yhteenlaskettaviin. Tämä määrä kasvaa asymptoottisesti nopeammin kuin mikä tahansa muuttujan n polynomi (katso esim. partition function-wikipediasivu). Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

23 Dynaamisen ohjelmoinnin ratkaisu tallentamisella Koska osaongelmat esiintyvät useasti kutsupuussa, voidaan jälleen käyttää niiden ratkaisujen tallentamista def cut ( n : I n t, p r i c e s : Array [ I n t ] ) = { r e q u i r e ( prices. length >= n+1) r e q u i r e ( p r i c e s ( 0 ) == 0 && p r i c e s. f o r a l l ( >= 0) ) val m = scala. c o l l e c t i o n. mutable.map[ I n t, Long ] ( ) def i n n e r ( k : I n t ) : Long = m. getorelseupdate ( k, { i f ( k == 0) 0 else { var best : Long = 1 for ( i < 1 to k ) best = best max ( p r i c e s ( i ) + i n n e r ( k i ) ) best ) i n n e r ( n ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

24 Kutsupuu osaongelmien ratkaisujen tallentamisella kun n = 4 cut(4, prices) inner(4) inner(3) inner(2) inner(1) inner(0) inner(2) inner(1) inner(0) inner(1) inner(0) inner(0) inner(1) inner(0) inner(0) inner(0) inner(0) Jälleen vihreiden solmujen ratakaisut löytyvät tallennettuina ja niiden punaisia alipuita ei käydä ikinä läpi Ajoaika: T (0) = O(1) and T (n) = O(n) + T (n 1) = O(n 2 ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

25 Ratkaisun konstruointi Tangonleikkausongelmassa pelkkä maksimituotto ei välttämättä riitä vaan tahdotaan tietää myös kuinka se saadaan aikaiseksi eli millaisiin paloihin tanko tulee leikata sen aikaansaamiseksi Tämä tieto saadaan talteen yksinkertaisesti muistamalla jokaisella kutsulla inner(k) parhaan tuoton lisäksi myös se, miten se saatiin aikaiseksi 3 3 parhaita tapoja voi olle useita mutta pidetään muistissa vain yhtä koska vastaavia tapoja voi olla erittäin suuri määrä Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

26 Idea koodina def cut ( n : I n t, p r i c e s : Array [ I n t ] ) = { r e q u i r e ( prices. length >= n+1) r e q u i r e ( p r i c e s ( 0 ) == 0 && p r i c e s. f o r a l l ( >= 0) ) val m = scala. c o l l e c t i o n. mutable.map[ I n t, ( Long, L i s t [ I n t ] ) ] ( ) def i n n e r ( k : I n t ) : ( Long, L i s t [ I n t ] ) = m. getorelseupdate ( k, { i f ( k == 0) ( 0, N i l ) else { var best : Long = 1 var bestcuts : L i s t [ I n t ] = null for ( i < 1 to k ) { val ( subvalue, subcuts ) = i n n e r ( k i ) i f ( subvalue + p r i c e s ( i ) > best ) { best = subvalue + p rice s ( i ) bestcuts = i : : subcuts ( best, bestcuts ) ) i n n e r ( n ) Ajoaika on edelleen O(n 2 ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

27 Sama iteratiivisella alhaalta ylös -tyylillä ja taulukoilla: def cut ( n : I n t, p r i c e s : Array [ I n t ] ) = { r e q u i r e ( prices. length >= n+1) r e q u i r e ( p r i c e s ( 0 ) == 0 && p r i c e s. f o r a l l ( >= 0) ) val m = new Array [ ( Long, L i s t [ I n t ] ) ] ( n+1) m( 0 ) = ( 0, N i l ) / / The base case for ( k < 1 to n ) { var best : Long = 1 var bestcuts : L i s t [ I n t ] = null for ( i < 1 to k ) { val ( subvalue, subcuts ) = m( k i ) i f ( subvalue + p r i c e s ( i ) > best ) { best = subvalue + p rice s ( i ) bestcuts = i : : subcuts m( k ) = ( best, bestcuts ) m( n ) Muistin käyttö: Θ(n) Miksi parhaiden ratkaisujen tallentaminen ei nosta muistinkäyttöä neliölliseksi eli Θ(n 2 )? Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

28 Kertaus: milloin dynaaminen ohjelmointi toimii? Yleisesti ottaen, dynaamista ohjelmointia voidaan käyttää kun 1 (optimaalinen) ratkaisu voidaan määritellä käyttämällä pienempiä (optimaalisia) osaongelmien ratkaisuja ja 2 osaongelmat limittyvät eli saman osaongelman ratkaisua tarkastellaan useasti Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

29 Esimerkki III: Pisin yhteinen osamerkkijono Vielä yksi esimerkki... Tarkastellaan kahta merkkijonoa X = (x 1,...,x n ) ja Y = (y 1,...,y m ) Nämä voisivat olla vaikkapa DNA-sekvenssejä, tekstejä tms Tällaisten jonojen samankaltaisuudelle on monta erilaista määritelmää Tarkastellaan seuraavassa erästä: merkkijonojen X ja Y yhteinen osamerkkijono on merkkijono Z = (z 1,...,z k ), jonka merkit esiintyvät tässä järjestyksessä kummassakin merkkijonossa X ja Y pisin yhteinen osamerkkijono (engl. longest common subsequence, LCS) on yhteinen osamerkkijono, jolla on suurin mahdollinen pituus Mitä pidempiä pisimmät yhteiset osamerkkijonot ovat, sitä samankaltaisempia merkkijonot ovat Pisimmän yhteisen osamerkkijonon ongelma on: annettuna kaksi merkkijonoa, etsi yksi niiden pisimmistä yhteisistä osamerkkijonoista Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

30 Esimerkki Tarkastellaan merkkijonoja X = (A,C,G,T,A,T ) ja Y = (A,T,G,T,C,T ). Niiden (yksikäsitteinen) pisin yhteinen osamerkkijono on (A, G, T, T ). Esimerkki Pisimpiä yhteisiä osamerkkijonoja voi olla useita; merkkijonojen X = (C,C,C,T,T,T ) ja Y = (T,T,T,C,C,C) pisimmät yhteiset osamerkkijonot ovat (C,C,C) ja (T,T,T ) Yksinkertainen ratkaisu pisimpien yhteisten osamerkkojonojen löytämiselle olisi tuottaa ( pisin ensin -järjestyksessä) toisen merkkijonon kaikki osamerkkijonot ja tarkastaa, löytyvätkö ne toisesta merkkijonosta Tämä olisi tehotonta koska osamerkkijonoja on eksponentiaalinen määrä Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

31 Rekursiivinen määritelmä Jotta voitaisiin käyttää dynaamista ohjelmointia, määritellään optimiratkaisu pienempien optimaalisten osaratkaisujen avulla Merkitään merkkijonjen X ja Y alkuosia seuraavasti: X i = (x 1,...,x i ) kun 0 i n ja Y j = (y 1,...,y i ) kun 0 j m Idea: tarkastellaan merkkijonojen X n = (x 1,...,x n ) ja Y m = (y 1,...,y m ) viimeisiä merkkejä Jos x n = y m, niin saadan merkkijonjen X n ja Y m eräs LCS ottamalla merkkijonojen X n 1 ja Y m 1 mikä tahansa LCS ja lisäämällä sen loppuun merkki x n Jos x n y m ja merkkijonojen X n ja Y m LCS Z ei sisällä merkkiä x n viimeisempänä, niin Z on merkkijonojen X n 1 ja Y m LCS Jos x n y m ja merkkijonojen X n ja Y m LCS Z ei sisällä merkkiä y m viimeisempänä, niin Z on merkkijonojen X n ja Y m 1 LCS Perustapauksessa n = 0 tai m = 0; tällöin LCS on tyhjä merkkijono pituudeltaan 0 Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

32 Esimerkki Esitellään määritelmän eri tapauksia: 1 Jos X 6 = (A,C,G,T,A,T ) ja Y 5 = (A,G,C,C,T ), niin niiden pisimmät yhteiset osamerkkijonot ovat (A,C,T ) ja (A,G,T ). Nämä molemmat saadaa kahdesta merkkijonojen X 5 = (A,C,G,T,A) ja Y 4 = (A,G,C,C) pisimmästä yhteisestä osamerkkijonosta (A, C) ja (A, G) lisäämällä niiden loppuun merkki T 2 Jos X 5 = (A,G,C,A,C) ja Y 6 = (A,C,G,T,A,T ), niin niiden pisimmät osamerkkijonot ovat (A, C, A) ja (A, G, A). Kumpikaan ei sisällä merkkiä C viimeisenä merkkinä ja molemmat ovat merkkijonojen X 4 = (A,G,C,A) ja Y 6 = (A,C,G,T,A,T ) pisimmät yhteiset osamerkkijonot 3 Kolmas tapaus on symmetrinen edellisen tapauksen kanssa Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

33 Jälleen kerran toteutuksen tekeminen rekursiivisen määrittelyn avulla on helppoa: def l c s ( a : String, b : S t r i n g ) = { def i n n e r ( n : I n t, m: I n t ) : S t r i n g = { i f ( n < 0) else i f (m < 0) else i f ( a ( n ) == b (m) ) i n n e r ( n 1, m 1) + a ( n ) else Seq ( i n n e r ( n 1, m), i n n e r ( n, m 1) ). maxby(. length ) i n n e r ( a. length 1, b. length 1) Huom: indeksointi alkaa indeksistä 0, ei 1 kuten matemaattisessa määritelmässä Ajoaika on jälleen eksponentiaalinen pahimmassa tapauksessa... mutta aika hyvä joillekin syötteille, esim. lcs( abcab, cab ). Miksi? Merkkien lisääminen merkkijonojen loppuun ei myöskään ole tehokasta eli myös tässä suhteessa ensimmäinen toteutus jättää parantamisen varaa Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

34 Eräs kutsupuu lcs('abac','acab') inner(3,3) inner(2,3) inner(3,2) inner(1,3) inner(2,2) inner(2,2) inner(3,1) inner(0,2) inner(1,1) inner(1,1) inner(2,0) inner(-1,1) inner(0,1) inner(1,0) inner(0,1) inner(1,0) inner(1,-1) inner(-1,1) inner(0,0) inner(0,0) inner(1,-1) inner(-1,1) inner(0,0) inner(0,0) inner(1,-1) inner(-1,-1) inner(-1,-1) inner(-1,-1) inner(-1,-1) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

35 Toinen kutsupuu lcs('ccc','bbb') inner(2,2) inner(1,2) inner(2,1) inner(0,2) inner(1,1) inner(1,1) inner(2,0) inner(-1,2) inner(0,1) inner(0,1) inner(1,0) inner(0,1) inner(1,0) inner(1,0) inner(2,-1) inner(-1,1) inner(0,0) inner(-1,1) inner(0,0) inner(0,0) inner(1,-1) inner(-1,1) inner(0,0) inner(0,0) inner(1,-1) inner(0,0) inner(1,-1) inner(-1,0) inner(0,-1) inner(-1,0) inner(0,-1) inner(-1,0) inner(0,-1) inner(-1,0) inner(0,-1) inner(-1,0) inner(0,-1) inner(-1,0) inner(0,-1) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

36 Osatulosten tallentaminen (vain pituus, ei osamerkkijonoa) def l c s ( a : String, b : S t r i n g ) = { val mem = scala. c o l l e c t i o n. mutable. HashMap [ ( I n t, I n t ), I n t ] ( ) def i n n e r ( n : I n t, m: I n t ) : I n t = mem. getorelseupdate ( ( n, m), { i f ( n < 0) 0 else i f (m < 0) 0 else i f ( a ( n ) == b (m) ) i n n e r ( n 1, m 1) + 1 else Seq ( i n n e r ( n 1, m), i n n e r ( n, m 1) ). max ) i n n e r ( a. length 1, b. length 1) Perustele seuraava väite: Algoritmin ajoaika on O(nm), missä n on merkkijonon a pituus ja m merkkijonon b Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

37 Osatulosten tallentaminen ja parhaan osamerkkijonon konstruointi def l c s ( a : String, b : S t r i n g ) = { val mem = scala. c o l l e c t i o n. mutable. HashMap [ ( I n t, I n t ), I n t ] ( ) def i n n e r ( n : I n t, m: I n t ) : I n t = mem. getorelseupdate ( ( n, m), { i f ( n < 0) 0 else i f (m < 0) 0 else i f ( a ( n ) == b (m) ) i n n e r ( n 1, m 1)+1 else Seq ( i n n e r ( n 1, m), i n n e r ( n, m 1) ). max ) i n n e r ( a. length 1, b. length 1) def r e c o n s t r u c t ( n : I n t, m: I n t ) : L i s t [ Char ] = { i f ( n < 0) N i l else i f (m < 0) N i l else i f ( a ( n ) == b (m) ) a ( n ) : : r e c o n s t r u c t ( n 1, m 1) else i f (mem( ( n, m) ) == mem( n 1, m) ) r e c o n s t r u c t ( n 1, m) else reconstruct ( n,m 1) r e c o n s t r u c t ( a. length 1, b. length 1). reverse. mkstring ( ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

38 Iteratiivinen versio Rekursiivisten toteutusten suurin haitta, myös osatulosten tallentamisen yhteydessä, on suurten rekursiosyvyyksien aiheuttama pinomuistin loppuminen ( stack overflow error ) järjestelmissä, joissa rekursiopinolle on varattu vain kiinteä määrä muistia Esimerkiksi edellä annetun Scala-ohjelman ajaminen tuhansien merkkien pituisilla merkkijonoilla, joilla on pitkä LCS, saa aikaan pinomuistin loppumisen tyypillisesti konfiguroidussa Java-virtuaalikoneessa Esitellään siis iteratiivinen versio, joka tallentaa merkkijonojen X i ja Y j pisimmän yhteisen osamerkkijon pituuden 2-uloitteisen taulukon table alkioon table[i,j] ja työskentelee alhaalta ylöspäin alkaen perustapauksista i = 0 ja j = 0 sekä laskien arvot table[i-1,j], table[i,j-1] ja table[i-1,j-1] ennen arvoa table[i,j] lopputulos on alkiossa table(n,m) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

39 def l c s ( x : String, y : S t r i n g ) : S t r i n g = { val ( n, m) = ( x. length, y. length ) val t a b l e = Array. t a b u l a t e [ I n t ] ( n+1,m+1) ({ case ( i, j ) => 0) for ( i < 1 to n ; j < 1 to m) { i f ( x ( i 1) == y ( j 1) ) t a b l e ( i ) ( j ) = t a b l e ( i 1) ( j 1) + 1 else i f ( t a b l e ( i 1) ( j ) >= t a b l e ( i ) ( j 1) ) t a b l e ( i ) ( j ) = t a b l e ( i 1) ( j ) else t a b l e ( i ) ( j ) = t a b l e ( i ) ( j 1) / / Reconstruct a s o l u t i o n var i = n var j = m var s o l u t i o n : L i s t [ Char ] = N i l while ( i > 0 && j > 0) { i f ( x ( i 1) == y ( j 1) ) { s o l u t i o n = x ( i 1) : : s o l u t i o n i = 1 j = 1 else i f ( t a b l e ( i 1) ( j ) >= t a b l e ( i ) ( j 1) ) i = 1 else j = 1 s o l u t i o n. mkstring ( ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

40 Muodostetaan taulukko merkkijonoille X = (A,G,C,T,C,T ) ja Y = (A,C,G,T,A,T ) A G C T C T A 0 1 C 2 G 3 T 4 A 5 T Nuolet kuvaavat suuntaa/suuntia, jotka tuottavat pisimmän yhteisen osamerkkijonon Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

41 Ahneet algoritmit Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

42 Edellisissä esimerkeissä dynaamisen ohjelmoinnin piti tutkia monia osaongelmia: minkä kokoinen pala leikataan ensin tangosta? kaksi tapausta kun x n y m pisimmän yhteisen osamerkkijonon ongelmassa Joskus on mahdollista valita ahneesti vain yksi tapaus ja täten käytännössä redusoida ongelma yhdeksi pienemmäksi osaongelmaksi Tarkastellaan seuraavassa yhtä yksinkertaista ahnetta algoritmia Verkkoja käsittelevällä kierroksella nähdään muita ahneita algoritmeja kun tarkastellaan pienimmän virittäjäpuun ongelmaa Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

43 Esimerkki IV: Toimintojen valinta -ongelma Annettuna äärellinen joukko toimintoja A = {a 1,...,a n Jokaiseen toimintoon a i on liitetty aloitusaika s i ja lopetusaika f i siten, että s i < f i Toiminto suoritetaan puoliavoimena ajanjaksona [s i,f i ) Kaksi toimintoa, a i ja a j kun i j, ovat yhteensopivia jos niitä ei suoriteta yhtä aikaa eli jos joko f i s j tai f j s i Tehtävänä on löytää (jokin) maksimaalinen osajoukko A A siten, että kaikki toiminnot osajoukossa ovat keskenään yhteensopivia Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

44 Esimerkki Tarkastellaan seuraavaa toimintojen joukkoa A = {a 1,...,a 11, missä i s i f i Eräs maksimaalinen keskenään yhteensopivien toimintojen joukko on {a 2,a 4,a 9,a 11. a 4 a 5 a 6 a 10 a 3 a 9 a 1 a 2 a 7 a 8 a 11 Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

45 Dynaamiseen ohjelmointiin perustuva ratkaisu Olkoon toimintojen joukko A = {a 1,...,a n Olkoon A l,u = {a i A l s i f i u niiden toimintojen joukko, joiden suoritus (i) alkaa ajanhetkenä l tai myöhemmin ja (ii) loppuu ennen ajanhetkeä u Tällöin A = A L,U, missä L = min i {1,...,n s i ja U = max i {1,...,n f i Jokaisella (osa)ongelmalla A l,u on seuraava optimaalisen osaongelman ominaisuus: Olkoon a i A l,u mikä tahansa toiminto Olkoot A l,s i ja A f i,u mitä tahansa maksimaalisia keskenään yhteensopivia toimintojen joukkoja osaongelmilla A l,si and A fi,u Tällöin A l,u at i = A l,s i {a i A f i,u on (eräs) sellainen suurin keskenään yhteensopivien toimintojen osajoukko (osa)ongelmalle A l,u, joka sisältää toiminnon a i Saadaan siis osaongelman A l,u maksimaalinen keskenään yhteensopivien toimintojen osajoukko A l,u ottamalla suurin joukosta {A l,u at j a j A l,u Ratkaisu alkuperäiseen ongelmaan on A L,U Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

46 On saatu rekursiivinen määritelmä ongelmalle ja tästä saadaan dynaamisen ohjelmoinnin algoritmi ongelmalle Huomaa, että riittää tarkastella (n + 1) (n + 1) kappaletta osaongelmia A l,u Täten dynaamisen ohjelmoinnin algoritmi saadaan helposti toimimaan polynomisessa ajassa Tämä ei päde suoraviivaiselle ratkaisulle, jossa listataan kaikki joukon A osajoukot, tarkastetaan jokaisen keskinäinen yhteensopivuus ja muistetaan suurin löydetty keskenään yhteensopiva osajoukko. Koska osajoukkoja on eksponentiaalinen määrä, myös tämän ratkaisun ajoaika olisi eksponentiaalinen. Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

47 Ahne algoritmi ongelmalle Toimintojen valinta -ongelmalla on eräs ominaisuus, jota voidaan käyttää vielä yksinkertaisemman ja nopeamman algoritmin tekemiseen Ei nimittäin tarvitse tarkastella kaikkia kulloisen osajoukon toimintoja vaan riittää valita toiminto, joka päättyy mahdollisimman aikaisin ja tämän jälkeen tarkastella osaongelmaa, josta tämä toiminto ja kaikki sen kanssa epäyhteensopivat toiminnot on poistettu Tämä optimointi perustuu havaintoon, että jos on olemassa maksimaalinen keskenään yhteensopivien toimintojen osajoukko, joka ei sisällä aikaisimmin päättyvää toimintoa a i, niin voidaan korvata osajoukon toinen toiminto toiminnolla a i ja saada aikaan yhtä suuri maksimaalinen keskenään yhteensopivien toimintojen joukko Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

48 Teoreema Olkoot A A maksimaalinen keskenään yhteensopivien toimintojen osajoukko, a i aikaisimman lopetusajan omaava toiminto joukossa A ja a j aikaisimman lopetusajan omaava toiminto joukossa A. Nyt (A \ {a j ) {a i on myös maksimaalinen keskenään yhteensopivien toimintojen osajoukko. Todistus Jos i = j, niin kaikki on kunnossa. Jos i j, niin täytyy päteä, että f i f j. Koska a j on aikaisimman lopetusajan omaava toiminto joukossa A, A ei sisällä yhtään a k, k j, jolle s k f i. Täten voidaan korvata toiminto a j toiminnolla a i joukossa A ja saadaan yhtä suuri maksimaalinen keskenään yhteensopivien toimintojen osajoukko. Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

49 Esimerkki Tarkastellaan taas toimintojen joukkoa A = {a 1,...,a 11, missä i s i f i Eräs maksimaalinen ratkaisu on {a 2,a 4,a 9,a 11 Tämä ei sisällä joukon A aikaisimmin päättyvää toimintoa a 1 Vaihdetaan a 1 joukon aikaisimmin päättyvän toiminnon a 2 tilalle ja saadaan uusi maksimaalinen ratkaisu {a 1,a 4,a 9,a 11 {a 4,a 9,a 11 on karsitun osaongelman {a 4,a 6,a 7,a 8,a 9,a 11, josta siis poistettu a 1 ja kaikki sen kanssa epäyhteensopivat toiminnot, eräs maksimaalinen ratkaisu a 4 a 5 a 6 a 10 a 3 a 9 a 1 a 2 a 7 a 8 a 11 Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

50 Ahneen algoritmin Scala-toteutus def a c t i v i t y S e l e c t o r ( acts : Seq [ ( I n t, I n t ) ] ) = { val sorted = acts. sortby (. 2 ) val s o l = scala. c o l l e c t i o n. mutable. A r r a y B u f f e r [ ( I n t, I n t ) ] ( ) var time = I n t. MinValue for ( act < sorted ) { i f ( act. 1 >= time ) { s o l += act time = act. 2 s o l. t o L i s t Esimerkkiongelman ratkaiseminen sillä: scala> val acts = L i s t ( ( 1, 4 ), ( 3, 5 ), ( 0, 6 ), ( 5, 7 ), ( 3, 9 ), ( 5, 9 ), ( 6, 1 0 ), ( 8, 1 1 ), ( 8, 1 2 ), ( 2, 1 4 ),(12,16) ) acts : L i s t [ ( I n t, I n t ) ] = L i s t ( ( 1, 4 ), ( 3, 5 ), ( 0, 6 ), ( 5, 7 ), ( 3, 9 ), ( 5, 9 ), (6,10), (8,11), (8,12), (2,14), (12,16) ) scala> a c t i v i t y S e l e c t o r ( acts ) res0 : L i s t [ ( I n t, I n t ) ] = L i s t ( ( 1, 4 ), ( 5, 7 ), (8,11), (12,16) ) Tommi Junttila (Aalto University) Kierros 6 CS-A1140 / Autumn / 50

CS-A1140 Tietorakenteet ja algoritmit

CS-A1140 Tietorakenteet ja algoritmit CS-A1140 Tietorakenteet ja algoritmit Kierros 6: Dynaaminen ohjelmointi ja ahneet algoritmit Tommi Junttila Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Syksy 2016 Materiaalia kirjassa

Lisätiedot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan

Lisätiedot

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

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Esimerkki otteluvoiton todennäköisyys A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Yksittäisessä pelissä A voittaa todennäköisyydellä p ja B todennäköisyydellä q =

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

Kierros 4: Binäärihakupuut

Kierros 4: Binäärihakupuut Kierros 4: Binäärihakupuut Tommi Junttila Aalto University School of Science Department of Computer Science CS-A1140 Data Structures and Algorithms Autumn 2017 Tommi Junttila (Aalto University) Kierros

Lisätiedot

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö Algoritmit 2 Luento 14 Ke 3.5.2017 Timo Männikkö Luento 14 Ositus ja rekursio Rekursion toteutus Kertaus ja tenttivinkit Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 2/30 Ositus Tehtävän esiintymä ositetaan

Lisätiedot

Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja

Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja 58053-7 Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja Malliratkaisut ja pisteytysohje: Jyrki Kivinen Tentin arvostelu: Jouni Siren (tehtävät 1 ja 2) ja Jyrki Kivinen (tehtävät

Lisätiedot

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö Johdatus diskreettiin matematiikkaan Harjoitus 5, 14.10.2015 1. Ratkaise rekursioyhtälö x n+4 2x n+2 + x n 16( 1) n, n N, alkuarvoilla x 1 2, x 2 14, x 3 18 ja x 4 42. Ratkaisu. Vastaavan homogeenisen

Lisätiedot

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n)) Määritelmä: on O(g(n)), jos on olemassa vakioarvot n 0 > 0 ja c > 0 siten, että c g(n) kun n > n 0 O eli iso-o tai ordo ilmaisee asymptoottisen ylärajan resurssivaatimusten kasvun suuruusluokalle Samankaltaisia

Lisätiedot

4.3. Matemaattinen induktio

4.3. Matemaattinen induktio 4.3. Matemaattinen induktio Matemaattinen induktio: Deduktion laji Soveltuu, kun ominaisuus on osoitettava olevan voimassa luonnollisilla luvuilla. Suppea muoto P(n) : Ominaisuus, joka joka riippuu luvusta

Lisätiedot

Algoritmit 1. Luento 13 Ti 23.2.2016. Timo Männikkö

Algoritmit 1. Luento 13 Ti 23.2.2016. Timo Männikkö Algoritmit 1 Luento 13 Ti 23.2.2016 Timo Männikkö Luento 13 Suunnittelumenetelmät Taulukointi Kapsäkkiongelma Ahne menetelmä Verkon lyhimmät polut Dijkstran menetelmä Verkon lyhin virittävä puu Kruskalin

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä

Lisätiedot

Luku 8. Aluekyselyt. 8.1 Summataulukko

Luku 8. Aluekyselyt. 8.1 Summataulukko Luku 8 Aluekyselyt Aluekysely on tiettyä taulukon väliä koskeva kysely. Tyypillisiä aluekyselyitä ovat, mikä on taulukon välin lukujen summa tai pienin luku välillä. Esimerkiksi seuraavassa taulukossa

Lisätiedot

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 1. Luento 13 Ma Timo Männikkö Algoritmit 1 Luento 13 Ma 26.2.2018 Timo Männikkö Luento 13 Suunnittelumenetelmät Taulukointi Kapsäkkiongelma Ahne menetelmä Verkon lyhimmät polut Dijkstran menetelmä Verkon lyhin virittävä puu Kruskalin

Lisätiedot

Algoritmit 2. Luento 8 To Timo Männikkö

Algoritmit 2. Luento 8 To Timo Männikkö Algoritmit 2 Luento 8 To 4.4.2019 Timo Männikkö Luento 8 Algoritmien analysointi Algoritmien suunnittelu Rekursio Osittaminen Rekursioyhtälöt Rekursioyhtälön ratkaiseminen Master-lause Algoritmit 2 Kevät

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

Lisätiedot

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö 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

Lisätiedot

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmi on periaatteellisella tasolla seuraava: Algoritmi on periaatteellisella tasolla seuraava: Dijkstra(V, E, l, v 0 ): S := { v 0 } D[v 0 ] := 0 for v V S do D[v] := l(v 0, v) end for while S V do valitse v V S jolle D[v] on minimaalinen S := S

Lisätiedot

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

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen Luento omatoimisen luennan tueksi algoritmiikan tutkimusseminaarissa 23.9.2002. 1 Sisältö Esitellään ongelmat Steiner-puu Kauppamatkustajan

Lisätiedot

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö Algoritmit 2 Luento 13 Ti 30.4.2019 Timo Männikkö Luento 13 Simuloitu jäähdytys Merkkijonon sovitus Horspoolin algoritmi Ositus ja rekursio Rekursion toteutus Algoritmit 2 Kevät 2019 Luento 13 Ti 30.4.2019

Lisätiedot

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

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2 Johdatus diskreettiin matematiikkaan Harjoitus 4, 7.10.2015 1. Olkoot c 0, c 1 R siten, että polynomilla r 2 c 1 r c 0 on kaksinkertainen juuri. Määritä rekursioyhtälön x n+2 = c 1 x n+1 + c 0 x n, n N,

Lisätiedot

CS-A1140 Tietorakenteet ja algoritmit

CS-A1140 Tietorakenteet ja algoritmit CS-A1140 Tietorakenteet ja algoritmit Kierros 4: Binäärihakupuut Tommi Junttila Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Syksy 2016 Sisältö Binäärihakupuut Avainten lisääminen,

Lisätiedot

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö Algoritmit 2 Luento 13 Ti 2.5.2017 Timo Männikkö Luento 13 Merkkijonon sovitus Horspoolin algoritmi Laskennallinen vaativuus Päätösongelmat Epädeterministinen algoritmi Vaativuusluokat NP-täydellisyys

Lisätiedot

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

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta AVL-puut eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta pohjana jo esitetyt binäärihakupuiden operaatiot tasapainotus vie pahimmillaan lisäajan lisäys- ja

Lisätiedot

Vaihtoehtoinen tapa määritellä funktioita f : N R on

Vaihtoehtoinen tapa määritellä funktioita f : N R on Rekursio Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on käyttää rekursiota: 1 (Alkuarvot) Ilmoitetaan funktion arvot

Lisätiedot

Algoritmit 2. Luento 10 To Timo Männikkö

Algoritmit 2. Luento 10 To Timo Männikkö 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

Lisätiedot

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

Esimerkkejä polynomisista ja ei-polynomisista ongelmista Esimerkkejä polynomisista ja ei-polynomisista ongelmista Ennen yleisempiä teoriatarkasteluja katsotaan joitain tyypillisiä esimerkkejä ongelmista ja niiden vaativuudesta kaikki nämä ongelmat ratkeavia

Lisätiedot

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on Rekursio Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on käyttää rekursiota: Rekursio Funktio f : N R määritellään yleensä

Lisätiedot

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö Algoritmit 1 Luento 12 Ti 19.2.2019 Timo Männikkö Luento 12 Osittamisen tasapainoisuus Pikalajittelun vaativuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu Algoritmit

Lisätiedot

58131 Tietorakenteet ja algoritmit (syksy 2015)

58131 Tietorakenteet ja algoritmit (syksy 2015) 58131 Tietorakenteet ja algoritmit (syksy 2015) Harjoitus 2 (14. 18.9.2015) Huom. Sinun on tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. 1. Erään algoritmin suoritus vie 1 ms, kun syötteen

Lisätiedot

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö Algoritmit 1 Luento 11 Ti 14.2.2017 Timo Männikkö Luento 11 Algoritminen ongelmanratkaisu Osittaminen Lomituslajittelu Lomituslajittelun vaativuus Rekursioyhtälöt Pikalajittelu Algoritmit 1 Kevät 2017

Lisätiedot

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento

Lisätiedot

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen: Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen: S A S B Samaan jäsennyspuuhun päästään myös johdolla S AB Ab ab: S A S B Yhteen jäsennyspuuhun liittyy aina tasan yksi vasen

Lisätiedot

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö Algoritmit 2 Luento 3 Ti 20.3.2018 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2018 Luento 3 Ti 20.3.2018

Lisätiedot

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö Algoritmit 2 Luento 6 To 28.3.2019 Timo Männikkö Luento 6 B-puun operaatiot Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 2/30 B-puu 40 60 80 130 90 100

Lisätiedot

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu 811312A Tietorakenteet ja algoritmit 2017-2018, Harjoitus 2 ratkaisu Harjoituksen aiheena on algoritmien oikeellisuus. Tehtävä 2.1 Kahvipurkkiongelma. Kahvipurkissa P on valkoisia ja mustia kahvipapuja,

Lisätiedot

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö Algoritmit 2 Luento 7 Ti 4.4.2017 Timo Männikkö Luento 7 Joukot Joukko-operaatioita Joukkojen esitystapoja Alkiovieraat osajoukot Toteutus puurakenteena Algoritmit 2 Kevät 2017 Luento 7 Ti 4.4.2017 2/26

Lisätiedot

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta 811312A Tietorakenteet ja algoritmit 2017-2018 Kertausta kurssin alkuosasta II Perustietorakenteet Pino, jono ja listat tunnettava Osattava soveltaa rakenteita algoritmeissa Osattava päätellä operaatioiden

Lisätiedot

1.4 Funktioiden kertaluokat

1.4 Funktioiden kertaluokat 1.4 Funktioiden kertaluokat f on kertaluokkaa O(g), merk. f = O(g), jos joillain c > 0, m N pätee f(n) cg(n) aina kun n m f on samaa kertaluokkaa kuin g, merk. f = Θ(g), jos joillain a, b > 0, m N pätee

Lisätiedot

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina Hakupuut tässä luvussa tarkastelemme puita tiedon tallennusrakenteina hakupuun avulla voidaan toteuttaa kaikki joukko-tietotyypin operaatiot (myös succ ja pred) pahimman tapauksen aikavaativuus on tavallisella

Lisätiedot

Tietorakenteet, laskuharjoitus 1,

Tietorakenteet, laskuharjoitus 1, Tietorakenteet, laskuharjoitus 1, 19.-22.1 Huom: laskarit alkavat jo ensimmäisellä luentoviikolla 1. Taustaa http://wiki.helsinki.fi/display/mathstatkurssit/matukurssisivu Halutaan todistaa, että oletuksesta

Lisätiedot

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö Algoritmit 1 Luento 12 Ke 15.2.2017 Timo Männikkö Luento 12 Pikalajittelu Pikalajittelun vaativuus Osittamisen tasapainoisuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu

Lisätiedot

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö Algoritmit 2 Luento 4 To 21.3.2019 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2019 Luento 4

Lisätiedot

811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu

811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu 832A Tietorakenteet ja algoritmit, 204-205, Harjoitus 7, ratkaisu Hajota ja hallitse-menetelmä: Tehtävä 7.. Muodosta hajota ja hallitse-menetelmää käyttäen algoritmi TULOSTA_PUU_LASKEVA, joka tulostaa

Lisätiedot

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

811312A Tietorakenteet ja algoritmit II Perustietorakenteet 811312A Tietorakenteet ja algoritmit 2017-2018 II Perustietorakenteet Sisältö 1. Johdanto 2. Pino 3. Jono 4. Lista 811312A TRA, Perustietorakenteet 2 II.1. Johdanto Tietorakenne on tapa, jolla algoritmi

Lisätiedot

Nopea kertolasku, Karatsuban algoritmi

Nopea kertolasku, Karatsuban algoritmi Nopea kertolasku, Karatsuban algoritmi Mikko Männikkö 16.8.2004 Lähde: ((Gathen and Gerhard 1999) luku II.8) Esityksen kulku Algoritmien analysointia (1), (2), (3), (4) Klassinen kertolasku Parempi tapa

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien

Lisätiedot

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120 Tehtävä 1 : 1 Merkitään jatkossa kirjaimella H kaikkien solmujoukon V sellaisten verkkojen kokoelmaa, joissa on tasan kolme särmää. a) Jokainen verkko G H toteuttaa väitteen E(G) [V]. Toisaalta jokainen

Lisätiedot

4 Tehokkuus ja algoritmien suunnittelu

4 Tehokkuus ja algoritmien suunnittelu TIE-20100 Tietorakenteet ja algoritmit 52 4 Tehokkuus ja algoritmien suunnittelu Tässä luvussa pohditaan tehokkuuden käsitettä ja esitellään kurssilla käytetty kertaluokkanotaatio, jolla kuvataan algoritmin

Lisätiedot

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö Algoritmit 2 Luento 3 Ti 21.3.2017 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017

Lisätiedot

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

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut 58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut 1. Palautetaan vielä mieleen O-notaation määritelmä. Olkoon f ja g funktioita luonnollisilta luvuilta positiivisille

Lisätiedot

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Tietorakenteet, laskuharjoitus 3, ratkaisuja Tietorakenteet, laskuharjoitus 3, ratkaisuja 1. (a) Toistolauseen runko-osassa tehdään yksi laskuoperaatio, runko on siis vakioaikainen. Jos syöte on n, suoritetaan runko n kertaa, eli aikavaativuus kokonaisuudessaan

Lisätiedot

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I. Vaihto-ominaisuudella on seuraava intuition kannalta keskeinen seuraus: Olkoot A I ja B I samankokoisia riippumattomia joukkoja: A = B = m jollain m > 0. Olkoon vielä n = m A B, jolloin A B = B A = n.

Lisätiedot

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.

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. Tietorakenteet, laskuharjoitus 11, ratkaisuja 1. Leveyssuuntaisen läpikäynnin voi toteuttaa rekursiivisesti käsittelemällä jokaisella rekursiivisella kutsulla kaikki tietyllä tasolla olevat solmut. Rekursiivinen

Lisätiedot

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 1.1. (a) Jaettava m, jakaja n. Vähennetään luku n luvusta m niin kauan kuin m pysyy ei-negatiivisena. Jos jäljelle jää nolla, jaettava oli tasan jaollinen. int m,

Lisätiedot

SAT-ongelman rajoitetut muodot

SAT-ongelman rajoitetut muodot SAT-ongelman rajoitetut muodot olemme juuri osoittaneet että SAT on NP-täydellinen perusidea on nyt osoittaa joukolle kiinnostavia ongelmia A NP että SAT p m A, jolloin kyseiset A myös ovat NP-täydellisiä

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9 Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9 Tuntitehtävät 9-10 lasketaan alkuviikon harjoituksissa ja tuntitehtävät 13-14 loppuviikon harjoituksissa. Kotitehtävät 11-12 tarkastetaan loppuviikon

Lisätiedot

811312A Tietorakenteet ja algoritmit, 2015-2016. VI Algoritmien suunnitteluparadigmoja

811312A Tietorakenteet ja algoritmit, 2015-2016. VI Algoritmien suunnitteluparadigmoja 811312A Tietorakenteet ja algoritmit, 2015-2016 VI Algoritmien suunnitteluparadigmoja Sisältö 1. Hajota ja hallitse-menetelmä 2. Dynaaminen taulukointi 3. Ahneet algoritmit 4. Peruuttavat algoritmit 811312A

Lisätiedot

Esimerkkejä vaativuusluokista

Esimerkkejä vaativuusluokista Esimerkkejä vaativuusluokista Seuraaville kalvoille on poimittu joitain esimerkkejä havainnollistamaan algoritmien aikavaativuusluokkia. Esimerkit on valittu melko mielivaltaisesti laitoksella tehtävään

Lisätiedot

Epädeterministisen Turingin koneen N laskentaa syötteellä x on usein hyödyllistä ajatella laskentapuuna

Epädeterministisen Turingin koneen N laskentaa syötteellä x on usein hyödyllistä ajatella laskentapuuna Epädeterministisen Turingin koneen N laskentaa syötteellä x on usein hyödyllistä ajatella laskentapuuna. q 0 x solmuina laskennan mahdolliset tilanteet juurena alkutilanne lehtinä tilanteet joista ei siirtymää,

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt

Lisätiedot

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

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria Graafit ja verkot Suuntamaton graafi: eli haaroja Joukko solmuja ja joukko järjestämättömiä solmupareja Suunnattu graafi: Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria Haaran päätesolmut:

Lisätiedot

Verkon värittämistä hajautetuilla algoritmeilla

Verkon värittämistä hajautetuilla algoritmeilla Verkon värittämistä hajautetuilla algoritmeilla 5 12 30 19 72 34 Jukka Suomela 15 77 18 4 9. tammikuuta 2012 19 2 68 Verkko 2 Verkko solmu 3 Verkko solmu kaari 4 Hajautettu järjestelmä solmu (tietokone)

Lisätiedot

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento

Lisätiedot

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1 Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla,

Lisätiedot

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

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko, Tehtävä 1 : 1 a) Olkoon G heikosti yhtenäinen suunnattu verkko, jossa on yhteensä n solmua. Määritelmän nojalla verkko G S on yhtenäinen, jolloin verkoksi T voidaan valita jokin verkon G S virittävä alipuu.

Lisätiedot

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö Algoritmit 2 Luento 4 Ke 22.3.2017 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2017 Luento 4

Lisätiedot

5 Kertaluokkamerkinnät

5 Kertaluokkamerkinnät TIE-20100 Tietorakenteet ja algoritmit 75 5 Kertaluokkamerkinnät Tässä luvussa käsitellään asymptoottisessa analyysissa käytettyjä matemaattisia merkintätapoja Määritellään tarkemmin Θ, sekä kaksi muuta

Lisätiedot

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö Algoritmit 1 Luento 10 Ke 14.2.2018 Timo Männikkö Luento 10 Algoritminen ongelmanratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Lisäyslajittelu Valintalajittelu Permutaatiot

Lisätiedot

Kierros 2: Järjestämisalgoritmeja

Kierros 2: Järjestämisalgoritmeja Kierros : Järjestämisalgoritmeja Tommi Junttila Aalto University School of Science Department of Computer Science CS-A4 Data Structures and Algorithms Autumn 7 Tommi Junttila (Aalto University) Kierros

Lisätiedot

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Tietorakenteet, laskuharjoitus 7, ratkaisuja Tietorakenteet, laskuharjoitus, ratkaisuja. Seuraava kuvasarja näyttää B + -puun muutokset lisäysten jälkeen. Avaimet ja 5 mahtuvat lehtisolmuihin, joten niiden lisäys ei muuta puun rakennetta. Avain 9

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 1: Rekursiivinen ajattelutapa, Scheme-kielen perusteita (mm. SICP 11.2.4) Riku Saikkonen 16. 10. 2012 Sisältö 1 Kurssijärjestelyitä 2 Perusteita Scheme-kielestä,

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Keskeneräinen luento 3: Listat (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Linkitetyt listat (SICP 2.1.1, 2.2.1) funktionaalinen

Lisätiedot

Kierros 1: Algoritmianalyysin ja tietorakenteiden perusteita

Kierros 1: Algoritmianalyysin ja tietorakenteiden perusteita Kierros 1: Algoritmianalyysin ja tietorakenteiden perusteita Tommi Junttila Aalto University School of Science Department of Computer Science CS-A1140 Data Structures and Algorithms Autumn 2017 Tommi Junttila

Lisätiedot

Miten osoitetaan joukot samoiksi?

Miten osoitetaan joukot samoiksi? Miten osoitetaan joukot samoiksi? Määritelmä 1 Joukot A ja B ovat samat, jos A B ja B A. Tällöin merkitään A = B. Kun todistetaan, että A = B, on päättelyssä kaksi vaihetta: (i) osoitetaan, että A B, ts.

Lisätiedot

Tietojenkäsittelyteorian alkeet, osa 2

Tietojenkäsittelyteorian alkeet, osa 2 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 12. syyskuuta 2016 Sisällys vs Ovat eri asioita! Älä sekoita niitä. Funktiot Funktio f luokasta A luokkaan B, merkitään

Lisätiedot

Johdatus matemaattiseen päättelyyn

Johdatus matemaattiseen päättelyyn Johdatus matemaattiseen päättelyyn Maarit Järvenpää Oulun yliopisto Matemaattisten tieteiden laitos Syyslukukausi 2015 1 Merkintöjä 2 Todistamisesta 2 3 Joukko-oppia Tässä luvussa tarkastellaan joukko-opin

Lisätiedot

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö Algoritmit 1 Luento 2 Ke 11.1.2017 Timo Männikkö Luento 2 Algoritmin esitys Algoritmien analysointi Suoritusaika Asymptoottinen kertaluokka Peruskertaluokkia NP-täydelliset ongelmat Algoritmit 1 Kevät

Lisätiedot

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö Algoritmit 1 Luento 5 Ti 24.1.2017 Timo Männikkö Luento 5 Järjestetty lista Järjestetyn listan operaatiot Listan toteutus taulukolla Binäärihaku Binäärihaun vaativuus Algoritmit 1 Kevät 2017 Luento 5 Ti

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA34 Funktio-ohjelmointi, kevät 2008 Luento 3 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 2. tammikuuta 2008 Ydin-Haskell: Syntaksi Lausekkeita (e) ovat: nimettömät funktiot: \x

Lisätiedot

isomeerejä yhteensä yhdeksän kappaletta.

isomeerejä yhteensä yhdeksän kappaletta. Tehtävä 2 : 1 Esitetään aluksi eräitä havaintoja. Jokaisella n Z + symbolilla H (n) merkitään kaikkien niiden verkkojen joukkoa, jotka vastaavat jotakin tehtävänannon ehtojen mukaista alkaanin hiiliketjua

Lisätiedot

7.4 Sormenjälkitekniikka

7.4 Sormenjälkitekniikka 7.4 Sormenjälkitekniikka Tarkastellaan ensimmäisenä esimerkkinä pitkien merkkijonojen vertailua. Ongelma: Ajatellaan, että kaksi n-bittistä (n 1) tiedostoa x ja y sijaitsee eri tietokoneilla. Halutaan

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 ari.vesanen (at) oulu.fi 5. Rekursio ja induktio Rekursio tarkoittaa jonkin asian määrittelyä itseensä viittaamalla Tietojenkäsittelyssä algoritmin määrittely niin,

Lisätiedot

Diskreetin matematiikan perusteet Esimerkkiratkaisut 3 / vko 10

Diskreetin matematiikan perusteet Esimerkkiratkaisut 3 / vko 10 Diskreetin matematiikan perusteet Esimerkkiratkaisut / vko 0 Tuntitehtävät - lasketaan alkuviikon harjoituksissa ja tuntitehtävät - loppuviikon harjoituksissa. Kotitehtävät - tarkastetaan loppuviikon harjoituksissa.

Lisätiedot

Sekvenssien segmentointi. Merkkijonoja. Sekvenssien segmentointi. ja dynaaminen ohjelmointi

Sekvenssien segmentointi. Merkkijonoja. Sekvenssien segmentointi. ja dynaaminen ohjelmointi Sekvenssien segmentointi ja dynaaminen ohjelmointi T-61.2010 Datasta tietoon Heikki Mannila, Jouni Seppänen syksy 2007 Sekvenssien segmentointi Erilaisia aikasarjoja esiintyy usein Miten aikasarja voidaan

Lisätiedot

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari Tehtävä 9 : 1 Merkitään kirjaimella G tehtäväpaperin kuvan vasemmanpuoleista verkkoa sekä kirjaimella H tehtäväpaperin kuvan oikeanpuoleista verkkoa. Kuvan perusteella voidaan havaita, että verkko G on

Lisätiedot

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö Algoritmit 1 Luento 7 Ti 31.1.2017 Timo Männikkö Luento 7 Järjestetty binääripuu Binääripuiden termejä Binääripuiden operaatiot Solmun haku, lisäys, poisto Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017

Lisätiedot

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

Ei-yhteydettömät kielet [Sipser luku 2.3] Ei-yhteydettömät kielet [Sipser luku 2.3] Yhteydettömille kielille pätee samantapainen pumppauslemma kuin säännöllisille kielille. Siinä kuitenkin pumpataan kahta osamerkkijonoa samaan tahtiin. Lause 2.25

Lisätiedot

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi

Lisätiedot

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö Algoritmit 1 Demot 1 25.-26.1.2017 Timo Männikkö Tehtävä 1 (a) Algoritmi, joka laskee kahden kokonaisluvun välisen jakojäännöksen käyttämättä lainkaan jakolaskuja Jaettava m, jakaja n Vähennetään luku

Lisätiedot

MS-A0402 Diskreetin matematiikan perusteet

MS-A0402 Diskreetin matematiikan perusteet MS-A040 Diskreetin matematiikan perusteet Osa : Relaatiot ja funktiot Riikka Kangaslampi 017 Matematiikan ja systeemianalyysin laitos Aalto-yliopisto Relaatiot Relaatio Määritelmä 1 Relaatio joukosta A

Lisätiedot

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö Yleistä Tehtävä: Tee Javalla StringStats-ohjelma, joka laskee esikäsittelemästään merkkijonosta joitakin tunnuslukuja. Lausekielinen ohjelmointi II

Lisätiedot

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö Algoritmit 1 Demot 2 7.-8.2.2018 Timo Männikkö Tehtävä 1 (a) Ei-rekursiivinen algoritmi: etsipienin(t, n) { pnn = t[0]; for (i = 1; i < n; i++) { pnn = min(pnn, t[i]); return pnn; Silmukka suoritetaan

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Merkintöjen tulkintoja *++Pstack->top = item *Pstack->top++ = item (*Pstack->top)++ *(Pstack++)->top = item *(++Pstack)->top = item Lisää pinon toteutuksia Dynaaminen taulukko

Lisätiedot

Rekursiiviset palautukset [HMU 9.3.1]

Rekursiiviset palautukset [HMU 9.3.1] Rekursiiviset palautukset [HMU 9.3.1] Yleisesti sanomme, että ongelma P voidaan palauttaa ongelmaan Q, jos mistä tahansa ongelmalle Q annetusta ratkaisualgoritmista voidaan jotenkin muodostaa ongelmalle

Lisätiedot

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

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen. Tietorakenteet, kevät 2012 Kurssikoe 2, mallivastaukset 2. (a) Järjestämistä ei voi missään tilanteessa suorittaa nopeammin kuin ajassa Θ(n log n), missä n on järjestettävän taulukon pituus. Epätosi: Yleisessä

Lisätiedot

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta 811312A Tietorakenteet ja algoritmit 2016-2017 Kertausta kurssin alkuosasta II Algoritmien analyysi: oikeellisuus Algoritmin täydellinen oikeellisuus = Algoritmi päättyy ja tuottaa määritellyn tuloksen

Lisätiedot

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen) TKT0001 Tietorakenteet ja algoritmit Erilliskoe 5.1.01, malliratkaisut (Jyrki Kivinen) 1. [1 pistettä] (a) Esitä algoritmi, joka poistaa kahteen suuntaan linkitetystä järjestämättömästä tunnussolmullisesta

Lisätiedot