3 Lajittelualgoritmeista

Koko: px
Aloita esitys sivulta:

Download "3 Lajittelualgoritmeista"

Transkriptio

1 3 Lajittelualgoritmeista Tässä osassa käsitellään edistyneempiä lajittelualgoritmeja, erityisesti keko- ja pikalajitteluja. Lisäksi perehdytään hieman lajittelualgoritmien suorituskyvyn rajoihin. Materiaali perustuu pääasiassa kirjan [Cor] lukuihin 6-8. Kappaleet ja sisältävät varsin matemaattisluontoista asiaa. Ne voi huoletta sivuuttaa, jos asiaa on vaikea seurata. 3.1 Pikalajittelu Pikalajittelu: Johdanto Pikalajittelu (Quicksort) on yleinen lajittelualgoritmi, joka on keskimäärin tehokas ja siten hyvä valinta monessa käytännän tapauksessa. Keskimäärin pikalajittelun suoritusaika on Θ(n lg n) Huonoimmillaan suoritusaika on Θ(n 2 ) Eli vaikka pahimmassa tapauksessa suoritusaika on pitkä, niin keskimääräinen suoritusaika on nopea. Pikalajittelun lisäetu on, että se voidaan toteuttaa siten, että se käsittelee datan paikallaan (in place) Suoritusta varten ei siis tarvitse varata ylimääräistä tilaa muistista. Seuraavissa alaluvuissa käydään läpi pikalajittelun suoritusperiaate Pikalajittelun kuvaus Pikalajittelu perustuu hajota ja hallitse -menetelmään. Lajittelun lähtäkohtana on sarana-alkio (engl. pivot). Muita alkioita verrataan sarana-alkioon. Saranaalkion avulla syäte lajitellaan kahteen osaan: 1. Saranaa suurempiin alkioihin ja 2. Saranaa pienempiin alkioihin Lajittelun jälkeen taulukko sisältää ensin sarana-alkiota pienemmät alkiot sitten sarana-alkion ja lopuksi sarana-alkiota suuremmat alkiot Mutta pienemmät alkiot eivät ole vielä oikeassa järjestyksessa keskenään - eivätkä suuremmatkaan. Nämä järjestetään kutsumalla algoritmia rekursiivisesti. Saranaalkioon ei tarvitse enää koskea, se on lopullisella paikallaan taulukossa. Lajiteltavat osajonot lyhenevät siis koko ajan - ja sarana-alkiot tulevat oikeille paikoille. Kun kahden alkion osajonot on lajiteltu, koko lajittelu on valmis. Kun osajonoa lajitellaan sarana-alkion perusteella, muodostuu neljä lokeroa kuten kuvassa 3.1. Kun lajittelu alkaa, on vain lokerot käsittelemätän ja pivot (siis sarana-alkio). Käsittelemätäntä lokeroa käydään läpi vasemmalta oikealle, muuttujaa j kasvattamalla. Muuttuja j kertoo 1. käsittelemättämän alkion sijainnin. Se siis määrittää >pivot ja käsittelemätän -lokerojen välisen rajan. Tästä seuraa, että

2 Kuva 3.1: Pikalajittelu: osajonon lajittelussa syntyvät lokerot. kun läytyy sarana-alkiota suurempi arvo, sen siirtämiseksi oikeaan lokeroon tarvitsee vain kasvattaa j:n arvoa yhdellä Muuttuja i kertoo lokeron <=pivot viimeisen alkion sijainnin. Kun läytyy sarana-alkiota pienempi alkio, niin lokeroon <=pivot tehdään tilaa muuttujjaa i kasvattamalla. tila otetaan lokerolta >pivot, joten tämän lokeron alkio pitää siirtää talteen Tämä käy helposti: läytynyt sarana-alkiota pienempi alkio sijaitsee juuri >pivot -lokeron oikealla puolella, joten alkiot saadaan oikeisiin lokeroihin vaihtamalla ne keskenään ja kasvattamalla j:n arvoa yhdellä Muuttujan j arvo siis kasvaa yhdellä joka kierroksella, mutta muuttujan i arvo vain silloin, kun läydetään sarana-alkiota pienempi arvo. Lopuksi alkio pivot ja lokeron >pivot 1. alkio vaihdetaan keskenään. Jäljellä on kolme lokeroa, <=pivot, pivot ja >pivot- tässä järjestyksessä Alkiot ovat siis osittain oikeassa järjestyksessä sarana-alkio oikealla paikallaan kaikki sitä pienemmät alkiot sitä ennen kaikki sitä suuremmat alkiot sen jälkeen Seuraavassa vaiheessa suoritetaan sama lajittelu kaksi kertaa: sarana-alkiota pienemmille alkioille ja suuremmille alkioille, jolloin saadaan neljä osajonoa oikeassa järjestyksessä. Näin jatketaan kunnes osajonojen pituus on kaksi alkiota ja nämäkin on lajiteltu.

3 Allaolevassa listauksessa on esitelty pikalajittelu pseudokoodina 1 q u i c k S o r t (A, f i r s t, l a s t ) 2 i f f i r s t < l a s t 3 middle = p a r t i t i o n (A, f i r s t, l a s t ) 4 q u i c k S o r t (A, f i r s t, middle 1) 5 q u i c k S o r t (A, middle +1, l a s t ) 6 return A 7 8 p a r t i t i o n (A, f i r s t, l a s t ) 9 p i v o t = A[ l a s t ] 10 i = f i r s t 1 11 for j = f i r s t to l a s t 1 12 i f A[ j ] <= p i v o t 13 i = i exchange A[ i ] with A[ j ] exchange A[ i +1] with A[ l a s t ] return i Pikalajittelun silmukkainvariantti Ennen silmukkainvariantin tutkimista se on tunnistettava algoritmin toiminnasta. Pikalajittelun tapauksessa partition-funktiossa valitaan sarana-alkio, jonka eri puolille alitaulukon A[first : last-1] alkiot jaetaan. Partition-funktion ajon aikana taulukko jaetaan neljään eri osioon, joista osa voi olla myäs tyhjiä. Osiot täyttävät tietyt ehdot jokaisen iteraation alussa nämä ehdot ovat pikalajittelun silmukkainvariantti (silmukan kierroksen aikana muuttumaton ominaisuus): 1. Jos first <= k <= i, niin A[k] <= pivot 2. Jos i + 1 <= k <= j 1, niin A[k] > pivot 3. Jos k = last, niin A[k] == pivot Taulukon loppupää, eli osio j:stä last-1:een ei ole missään järjestyksessä, eli sitä ei ole käsitelty Pikalajittelun silmukkainvariantin analyysi Tutkitaan, täyttyvätkä silmukkainvariantin kolmen osan oikeellisuusvaatimukset: Alustus For-silmukan alussa i = first 1 ja j = first Alkioiden f irst ja i välissä ei ole alkioita, kuten ei myäskään alkioiden i + 1 ja j 1. Tämän vuoksi silmukkainvariantin kaksi ensimmäistä ehtoa täyttyvät triviaalisti (k ei voi olla first:n ja i:n välissä) Sijoitus pivot = A[last] täyttää ehdon 3

4 Ylläpito Jos ehto A[j] <= pivot on epätosi, j:tä kasvatetaan, eikä muuta tapahdu Tälläin ehto 2 toteutuu A[j 1]:lle, ja muut ehdot täyttyvät edelleen Jos ehto A[j] <= pivot on tosi, i:tä kasvatetaan, A[i]:n ja A[j]:n paikat vaihdetaan, ja j:tä kasvatetaan Lopetus Huomaa, että i:tä kasvatetaan ennen paikkojen vaihtoa 1. ehto täyttyy, koska paikkojen vaihdon seurauksena A[i] <= pivot 2. ehto täyttyy, koska alkio A[j 1] (huomaa, j:tä on kasvatettu) on juuri paikkaa vaihtanut alkio, joka on aiemmin testattu suuremmaksi kuin sarana-alkio 3. ehto täyttyy, edelleen triviaalisti Nyt j = last, niin ehtojen 1 ja 2 kuvaamat osiot ja sarana-alkio kattavat koko taulukon; kaikki alkiot on siis jaettu invariantin kuvaamiin kolmeen osioon Pikalajittelun silmukkainvariantista on todistettu kaikki sen osa-alueet, joten voidaan todeta että lajittelu toimii oikein Pikalajitteluesimerkki Lajiteltava taulukko A on: [7, 2, 6, 1, 4, 5]. Taulukon Indeksointi aloitetaan ykkäsestä. Valitsemme sarana-alkioksi viimeisen alkion 5 Merkitään sarana-alkio _5_ Merkitään käsiteltävä alkio kaarisulkuihin () Tilanne: [ 7, 2, 6, 1, 4 _5_] i = 0, j = 1: [ (7), 2, 6, 1, 4 _5_] 7 > 5, joten ei vaihdeta i = 0, j = 2: [ 7 (2), 6, 1, 4 _5_] 2 <= 5, joten vaihdetaan A[i+1] ja A[j] i = 1, j = 3: [2 7 (6), 1, 4 _5_] 6 > 5, joten ei vaihdeta i = 1, j = 4: [2 7, 6 (1), 4 _5_] 1 <= 5, joten vaihdetaan A[i+1] ja A[j] i = 2, j = 5: [2, 1 6, 7 (4) _5_] 4 <= 5, joten vaihdetaan A[i+1] ja A[j] Tilanne [2, 1, 4 7, 6 _5_], i=3

5 Vaihdetaan lopuksi A[i+1] ja A[last] Tilanne [2, 1, 4, 5, 6, 7], middle=4 Kuten esimerkistä käy ilmi, pikalajittelu ei pyri suoraan sijoittamaan alkioita oikeille paikoille. Sarana-alkion avulla luodaan suurempien ja pienempien arvojen luokat Luokkien rekursiivinen jakaminen aliluokkiin johtaa täydelliseen suuruusjärjestykseen Pikalajittelun suorituskyky Pikalajittelun suorituskyky riippuu siitä, miten sarana-alkio (pivot) valitaan; tuottaako valinta tasapainoisen (balanced) alkiojoukon vaiko epäsuhtaisen (unbalanced) alkiojoukon Sarana-alkion valinta vaikuttaa suoraan luokkien kokoon, joka puolestaan vaikuttaa pikalajittelun suoritusaikaan. Mitä tasaisemmin luokkajako toteutetaan, sitä parempi on pikalajittelun suorituskyky. Paras tapaus Luokat > pivot ja <= pivot ovat samansuuruisia Suoritusaika verrattavissa lomituslajitteluun Huonoin tapaus Toinen luokista on koko ajan tyhjä Suoritusaika verrattavissa lisäyslajitteluun Pikalajittelun huonoimman tapauksen jako Pahimmassa tapauksessa on kyse siitä, että sarana-alkio on valittu huonosti, eli sarana-alkio on valittu joko liian pieneksi tai liian suureksi. Luokkien koot eivät ole samansuuruiset, jolloin pikalajittelun teho heikkenee Pahimmassa tapauksessa joko > pivot- tai <= pivot-luokka on tyhjä jokaisella rekursion tasolla partition-funktion suoritusaika on Θ(n) tyhjän puolen suoritusaika on T (0) = Θ(1) Suoritusaikaa kuvaava toistuvuus saa muodon Intuitio kertoo, että T (n) = T (n 1) + T (0) + Θ(n) = T (n 1) + Θ(n) T (n) = T (n 1) + T (n 2) +... Muodostuu siis aritmeettinen sarja ja voimme arvata toiston ratkaisuksi Θ(n 2 ) ja käyttää sijoitusmenetelmää todistamiseen.

6 3.1.8 Pikalajittelun parhaan tapauksen jako Parhaan tapauksen luokkajaossa valitaan sarana-alkioksi keskimmäinen, eli mediaani alkio. Koska valitaan mediaani, niin luokat > pivot ja <= pivot ovat samansuuruisia, jolloin saavutetaan paras suoritusaika. Parhaassa tapauksessa on kyse siis tasapainotetusta alkiojoukosta. partition-funktio tuottaa aina kaksi samansuuruita alkiojoukkoa Toistuvuus on tässä tapauksessa muotoa: T (n) 2T (n/2) + Θ(n), missä Θ(n) sisältää partition-funktion käyttämän ajan. Pääteoreeman avulla parhaan tapauksen suoritusajaksi saadaan Θ(n lg n). Tämä on asymptoottisesti parempi kuin huonoimman tapauksen aika Tasainen luokkajako Pikalajittelun keskimääräinen asymptoottinen suoritusaika on paljon lähempänä parasta tapausta Θ(n lg n) kuin huonointa tapausta Θ(n 2 ). Jakamista ei välttämättä tarvitse suorittaa tasan, jotta saadaan Θ(n lg n) asymptoottiseksi suoritusajaksi. Sama asymptoottinen suoritusaika saadaan, vaikka jako toteutettaisiin suhteessa 1:99! Tämän käytäksen syyn ymmärtäminen on avain pikalajittelun ymmärtämiseen. Seuraavassa tutkimme, miten luokkajaon tasaisuus näkyy toistuvuudessa. Oletetaan, että partition-funktio tuottaa aina 9:1 -luokkajaon, joka vaikuttaa aika huonolta. Tämä voidaan kuvata toistuvuudella T (n) T (9n/10) + T (n/10) + cn. Tässä c on otettu esiin, vrt. yllä, missä se on Θ(n):ssä piilossa. Piirtämällä tämä rekursiopuu (vrt. luento 4 ja kirjan sivu 71, 2nd ed.), voidaan todeta, että toistuvuus päättyy syvyydellä log 10/9 (n). Vastaavasti 1:99- jaon tapauksessa syvyys olisi log 100/99 (n). Esimerkiksi, kun n = 100, olisivat puiden syvyydet siis log 10/9 (100) = 43 ja log 100/99 (100) = 458. Kun taas parhaassa tapauksessa log 2 (100) 7 Jokaisen puun tason suoritusaika on cn (partition-funktio). Tämän lisäksi muistamme, että logaritmin kantaluvun vaihtaminen muuttaa sen suuruutta vakiokertoimella. Vaikka suhde siis olisi kuinka epätasainen, niin epäsuhta vaikuttaa suoritusaikaan vakiokertoimella. Vakiokerroin ei vaikuta asymptoottiseen käyttäytymiseen. Voimme todeta, että mikä tahansa kaikilla tasoilla vakio jakosuhde tuottaa saman Θ(n log n) asymptoottisen käyttäytymisen Satunnaistettu pikalajittelu Jotta pikalajittelu toimisi keskimäärin hyvin, voidaan se satunnaistaa. Eräässä menetelmässä partition-funktio valitsee sarana-alkion saamastaan aineistosta satunnaisesti ja muuten lajittelu toimii kuten aiemmin on esitetty.

7 Pikalajittelun matemaattinen analyysi Suoritusaika huonoimmassa tilanteessa: Olemme aiemmin olettaneet, että pikalajittelun luokkajaon valitseminen jokaisessa vaiheessa s.e. toinen luokista on tyhjä on huonoin mahdollinen jako. Pahimmassa tapauksessa pikalajittelun suoritusaika vaikuttaisi olevan O(n 2 ). Perustellaan näitä hieman. Pikalajittelun suoritusaika voidaan kirjoittaa T (n) = T (q) + T (n q 1) + Θ(n) (3.1) Tässä q vaihtelee 0:n ja n 1:n välillä, koska partition-funktio tuottaa kaksi aliongelmaa joiden yhteinen koko on n 1 (siis ilman sarana-alkiota). Arvaamme nyt, että T (n) cn 2 jollakin vakiolla c. Jos sijoitamme tämän yhtälään (3.1), saamme T (n) cq 2 + c(n q 1) 2 + Θ(n) = c[q 2 + (n q 1) 2 ] + Θ(n). (3.2) Koska olemme nyt etsimässä huonointa suoritusaikaa, tarkastellaan tämän funktion maksimia q:n suhteen (eli aliongelmien koon suhteen): Yhtälässä (3.3) Lauseke max T (n) max 0 q n 1 0 q n 1 [cq2 + c(n q 1) 2 + Θ(n)] (3.3) q 2 + (n q 1) 2 on yläspäin aukeava paraabeli q:lle. Se saavuttaa siis suurimman arvonsa alueen 0 q n 1 päätepisteessä. Kokeilemalla huomataan että lauseke saa saman arvon sekä sijoituksella q = 0 että q = n 1. Saadaan siis max 0 q n 1 (q2 + (n q 1) 2 ) = (n 1) 2 = n 2 2n + 1 Sijoitetaan tämä välitulos takaisin epäyhtälään (3.3), jolloin saadaan max T (n) 0 q n 1 cn2 c(2n 1) + Θ(n) cn 2 (3.4) Viimeinen epäyhtälä (3.4) voidaan osoittaa tarkasti induktiolla. Huomaa, että voimme valita riittävän suuren c:n, jotta c(2n 1) on paljon suurempi kuin Θ(n). Näin saamme max 0 q n 1 T (n) O(n2 ), mikä oletettiin aiemmin. Vastaavalla käsittelyllä voidaan etsiä pikalajittelun huonoimman tapauksen alaraja Pikalajittelun keskimääräinen suoritusaika Oletamme nyt että meillä on käytässä satunnaistettu pikalajittelu (randomized quicksort). Olemme aiemmin arvioineet, että keskimääräinen suoritusaika on O(n lg n). Tutkimalla tarkemmin pikalajittelun toimintaa näemme, että rekursion syvyys on Θ(lg n) ja jokaisen tason suoritus kestää O(n) luokkaa. Sama asymptoottinen suoritusaika saavutetaan, vaikka osa tasoista (jaoista) olisi täysin epätasapainoisia.

8 Voimme täsmällisemmin analysoida satunnaisen pikalajittelun, kun ymmärrämme paremmin kuinka algoritmi jakaa aineistoa osiin. Toiveenamme on johtaa keskimääräiselle suoritusajalle asymptoottinen yläraja O(n lg n). Tiedämme parhaan tapauksen perusteella että alaraja on Ω(n lg n) ja tälläin olemme osoittaneet keskimääräisen tapauksen suoritusajalle T (n) Θ(n lg n). Pikalajittelun suoritusajasta leijonaosa menee aineiston jakamisessa osiin (partition-funktio). Joka kerta kun aineisto jaetaan, valitaan sarana-alkio, jota ei koskaan käytetä myähemmissä rekursioissa. Koko pikalajittelun aikana suoritetaan korkeintaan n kappaletta partition-funktion kutsua Yksi aineiston jakaminen kestää O(1) ja ajan joka menee (for j = first to last-1)-lohkon suorittamiseen. Jokainen iteraatio suorittaa ainakin vertailuoperaation, jossa se vertaa alkiota sarana-elementtiin. Jos voimme laskea kuinka monta kertaa yhteensä tämä vertailu suoritetaan, voimme myäs antaa rajoituksen sille kuinka kauan aikaa vietetään for-silmukassa pikalajittelun suoritusajasta. Teemme ensin kaksi oletusta: Lemma 7.1: Olkoon X aineiston jakamisessa suoritettava vertailujen määrä n:n alkion kokoisessa pikalajittelussa. Tässä tapauksessa pikalajittelun suoritusaika on O(n + X) Todistus: Kuten ylhäällä tekstissä on todettu, aineiston lajittelussa partitionfunktiota kutsutaan n kertaa, joista jokainen kutsu tekee saman määrän muita tehtäviä ja suorittaa sitten jonkin kertamäärän for = first to last-lohkoa. Jokainen iteraatio suorittaa vertailuoperaation. Meidän täytyy siis laskea X, eli vertailujen kokonaismäärä. Emme yritä analysoida kuinka monta vertailua tehdään kussakin alikutsussa (kun aineistoa jaetaan osiin), vaan yritämme saada kokonaismäärän kaikista vertailuoperaatioista. Tämän saavuttamiseksi täytyy ymmärtää milloin algoritmi vertailee kahta arvoa ja milloin ei. Analyysin helpottamiseksi nimeämme taulun arvot z 1, z 2,..., z n Määrittelemme myäs että Z ij = {z i, z i+1,..., z j } ovat elementtien arvot välillä z i ja z j Voimmeko siis tietää missä tapauksissa algoritmi vertailee arvoja z i ja z j? Vastauksen läytämiseksi voimme todeta, että kutakin paria arvoja vertaillaan vain kerran. Tämä siksi, että arvoja vertaillaan vain sarana-alkioon, eikä samaa sarana-alkiota enää käytetä muissa partition-kutsuissa Määrittelemme: X ij = I{z i verrataan z j }. X ij saa arvon 1 kun vertailu tehdään ja arvon 0 kun vertailua ei tehdä Arvioimmme nyt vertailuja missä tahansa vaiheessa suoritusta, ei pelkästään kun aineistoa jaetaan osiin. Koska jokainen pari vertaillaan korkeintaan kerran, voimme luonnehtia vertailuoperaatioiden kokonaismäärää pikalajittelussa: X = n 1 n i=1 j=i+1 X ij

9 Tämä lauseke saadaan partition-funktion ja sen for-silmukan suoritusmääristä. Ottamalla tästä odotusarvot molemmilta puolilta, pääsemme seuraavaan muotoon. n 1 E[X] = E[ = = n 1 n i=1 j=i+1 n i=1 j=i+1 n 1 n i=1 j=i+1 X ij ] E[X ij ] P r{z i verrataan z j } (3.5) Nyt jää jäljelle termin P r{z i verrataan z j } laskeminen. Analyysimme olettaa, että sarana-alkio on valittu satunnaisesti ja riippumattomasti. On hyädyllistä miettiä mitä kahta termiä ei vertailla keskenään. Ajatellaan, että pikalajittelija lajittelee numerot 1-10 välillä (missä tahansa järjestyksessä) ja oletetaan että ensimmäinen sarana-alkio on numero 7. Tässä tapauksessa ensimmäinen aineiston jakaminen jakaa numerot kahteen eri joukkoon: {1,2,3,4,5,6} ja {8,9,10}. Nyt ensimmäistä jakajaa on verrattu kaikkiin muihin alkioihin, mutta mitään numeroa ensimmäisestä joukosta (kuten numeroa 2) ei koskaan verrata mihinkään numeroon toisesta joukosta (kuten numero 9). Yleisesti ottaen, kun jakaja x on valittu siten että z i < x < z j, tiedämme että z i ja z j alkioita ei vertailla enää jatkossa. Jos toisaalta z i valitaan saranaalkioksi ennen mitään muuta joukosta Z ij, niin z i :tä verrataan kaikkiin alkioihin Z ij :ssä (paitsi itseensä). Edellä kuvatussa esimerkissä arvoja 7 ja 9 verrataan toisiinsa koska 7 on ensimmäinen sarana-alkio Z 7,9 :stä. Numeroita 2 ja 9 ei koskaan vertailla keskenään koska ensimmäinen sarana-alkio Z 2,9 :stä on 7. Tästä voimme päätellä, että arvoja z i ja z j vertaillaan vain jos ensimmäiseksi jakajaksi Z ij :sta valitaan joko z i tai z j. Voimme nyt laskea todennäkäisyyden sille kuinka usein tämä tapahtuu. Ennen hetkeä jolloin alkio Z ij :stä on valittu jakajaksi, koko Z ij ovat samassa osiossa (partitiossa). Tässä tapauksessa mikä tahansa alkio Z ij :stä on yhtä todennäkäinen ensimmäiseksi sarana-alkioksi. Koska joukossa Z ij on j i+1 alkiota, todennäkäisyys sille että joku alkio valitaan ensimmäiseksi sarana-alkioksi on 1 per j i + 1. Joten, P r{z i verrataan z j } = P r{z i tai z j on ensimmainen valittu sarana-alkioz ij :stä} = P r{z i on ensimmäinen valittu sarana-alkio Z ij :stä} = = +P r{z j on ensimmäinen valittu sarana-alkio Z ij :stä} 1 j i j i (3.6) j i + 1 Yhdistämällä tämän aiemmin johtamaamme odotusarvon lausekkeeseen (3.5), saamme n 1 n 2 E[X] = j i + 1 i=1 j=i+1

10 Nyt hieman manipulointia: käytämme ensin sijoitusta k = j i: E[X] = < n 1 n i=1 j=i+1 n 1 n i=1 k=1 2 k n 1 2 j = n i i=1 k=1 2 k + 1 ja sitten harmonisen sarjan yhtälää jolloin pääsemme muotoon H n = n k=1 1 = ln n + O(1), k n 1 E[X] = O(lg n) = O(n lg n). i=1 Lemman 7.1 perusteella pikalajittelun suoritusajan ylärajaksi saadaan siis O(n + X) = O(n + n lg n) = O(n lg n). (3.7)

11 3.2 Kekolajittelu (Heapsort) Johdanto Tässä luvussa esitellään kekolajittelu. Lajittelu perustuu keko (heap) -nimisten tietorakenteiden muokkaukseen ja ylläpitoon. Tietorakenteella on siis keskeinen rooli algoritmin suorituksessa. Kekolajittelulle pätee: Suoritusaika T (n) O(n lg n), kuten lomituslajittelussa. In-place lajittelu eli vakiomääräinen muistinkäyttä, kuten lisäyslajittelussa. Kekolajittelulla on siis molempien aiemmin esiteltyjen algorimien hyvät ominaisuudet. Jotta ymmärrämme kekolajittelun toiminnan, tutustumme ensin binääripuuhun ja määrittelemme keon sen avulla. Näytämme, miten keko voidaan toteuttaa taulukolla ja esittelemme keon käsittelyyn ja ylläpitoon tarvittavat algoritmit. Tämän jälkeen meillä on kaikki tarvittava kekolajittelun toteuttamiseen ja analysoimiseen. Myähemmin kurssilla tutustumme myäs toiseen kekojen sovellutukseen, prioriteettijonoihin Binääripuu ja keon määritelmä Binääripuu määritellään seuraavasti: Yksi juurisolmu (root node). Jokaisen solmun lapsisolmujen (child node) määrä on korkeintaan kaksi. Tämä solmu on näiden lapsisolmujen vanhempi (parent). Sivu eli väli (engl. edge) yhdistää vanhemman sen lapsisolmuun. Lapsisolmuista käytetään nimityksiä vasen lapsi(solmu) (left child), sekä oikea lapsi(solmu) (right child). Lehtisolmu (leaf node) on (binääri)puun solmu, jolla ei ole lapsisolmuja. Täydellinen binääripuu sisältää joka tasolla aina joko nolla tai kaksi lapsisolmua, ja puu on kokonaisuudessaan täytetty lehtisolmujen tasolla. Binäärinen maksimikeko seuraavilla rajoituksilla: voidaan määritellä lähes täydellisenä binääripuuna Vanhempi on aina suurempi kuin sen lapset. Lehtisolmuja saa puuttua, kunhan ne puuttuvat puun oikeasta reunasta Vastaavasti minimikeossa vanhempi on aina pienempi kuin sen lapset. Käytämme tässä luvussa kekoa ja binääristä maksimikekoa synonyymeina ja mainitsemme erikseen kun on kyse minimikeosta. Kuvassa 3.2 vasemmalla on esitetty kokonaislukuja sisältävä keko binääripuuna.

12 Kuva 3.2: Vasemmalla keon puuesitys ja oikealla puuta vastaava taulukko Keon toteuttaminen taulukolla Koska keko on lähes täydellinen binääripuu, se voidaan toteuttaa kompaktisti ja tehokkaasti taulukolla, kuten kuvassa 3.2 oikealla. Taulukossa indeksillä i sijaitsevan solmun lapset ovat indekseillä 2i ja 2i + 1. Huom! Tässä oletetaan että taulukon ensimmäinen indeksi on 1! Listauksessa alla on esitetty keon alustamiseen ja keossa navigoitiin tarvittavat rutiinit. 1 i n i t ( aheap, array=none ) : 2 i f array == None : 3 array = [ ] 4 aheap. data = array 5 aheap. s i z e = array. l e n g t h 6 7 getparent ( i ) : 8 return i / g e t L e f t C h i l d ( i ) : 11 return 2 i getrightchild ( i ) : 14 return ( 2 i + 1) Kekomuuttuja aheap alustetaan rutiinissa aheap. Taulukon kopioimisen lisäksi alustetaan muuttuja aheap.size, joka on kekoon kuuluvien alkioiden määrän taulukossa aheap.data. Todellisuudessa tässä vaiheessa aheap ei vielä ole keko, sillä se ei toteuta aiemmin kerrottua keon määritelmää. Seuraavaksi täytyy määritellä algoritmi, jolla taulukosta saadaan luotua keko. Lisäksi haluamme että keosta voi poistaa ja siihen voi lisätä alkioita, niin että määritelmän mukaiset ominaisuudet säilyvät. Maksimikeon tulee toteuttaa siis aheap.data[getparent(i)] >= aheap.data[i] kaikilla i, 1 < i <= aheap.size. Vastaavasti minimikeolle pätee aheap.data[getparent(i)] <= aheap.data[i]. Kun jompi kumpi ehto ylläolevista on voimassa, sanotaan että taulukko toteuttaa keko-ominaisuuden.

13 3.2.4 Binääripuun korkeus Binääripuun korkeus (height) määritellään seuraavasti: Puun pisimmän lehtisolmusta juurisolmuun johtavan reitin sivujen lukumäärä. Lehtisolmujen korkeus on 0. Muille solmuille korkeus voidaan laskea kuten koko puulle: solmusta lehtisolmuun johtavan reitin sivujen lukumäärä laskemalla. n alkiota sisältävän keon korkeudelle pätee aina: height = Θ(log 2 n) = O(lg n) Tämä nähdään suoraan täydellisen binääripuun kuvasta: tasoilla on solmuja 1, 2, 4, 8, 16, 32,... Luennon myähemmissä osissa nähdään, että keoille tehtävien perusoperaatioiden suoritusaika on aina suhteessa keon korkeuteen : Asymptoottisesti rajoitettuja koon suhteen. O(lg n) Keko-ominaisuuden ylläpito Annetun n-mittaisen taulukon A muokkaaminen maksimikeoksi perustuu kahteen havaintoon: Alkiot A[( n/2 +1)...n] ovat lehtisolmuja. Jokainen lehtisolmu on triviaali maksimikeko. Osa taulukosta toteuttaa siis aina maksimikeko-ominaisuuden! Määritellään nyt algoritmi maxheapify(aheap, i), jonka avulla voimme ylläpitää keko-ominaisuutta. Algoritmi olettaa, että alipuut, joiden juurisolmuina ovat aheap.data[getleftchild(i)] ja aheap.data[getrightchild(i)], ovat jo valmiiksi maksimikekoja. Tarkasteltavana olevan puun juuri on alkio i - tämä alkio saattaa rikkoa keko-ominaisuuden. Tarkoituksena on pudottaa alkio i oikealle paikalleen alipuussa - jonka juurena se aluksi on. Pudottaminen tapahtuu vaihtamalla alkio i suuremman lapsensa kanssa ja toistamalla tätä rekursiivisesti, kunnes alkion lapset ovat pienempiä kuin alkio itse. 1 maxheapify ( aheap, i ) : 2 l e f t = g e t L e f t C h i l d ( i ) 3 r i g h t = getrightchild ( i ) 4 5 i f l e f t <= aheap. s i z e and aheap. data [ l e f t ] > aheap. data [ i ] : 6 l a r g e s t = l e f t 7 else : 8 l a r g e s t = i 9 10 i f r i g h t <= aheap. s i z e and aheap. data [ r i g h t ] > aheap. data [ l a r g e s t ] : 11 l a r g e s t = r i g h t i f l a r g e s t!= i : 14 aheap. data [ i ], aheap. data [ l a r g e s t ] = aheap. data [ l a r g e s t ], aheap. data [ i ] 15 maxheapify ( aheap, l a r g e s t )

14 Taulukon alkiot ovat siis puun solmuja, taulukon indeksi ilmaisee solmun sijainnin puussa aheap on viittaus muokattavaan puuhun, joka mahdollisesti ei ole keko, ts. tällä puulla ei välttämättä ole keko-ominaisuutta. i on taulukon sisälle viittaava indeksi, jolle pätee i <= aheap.size. Solmun i alipuilla on keko-ominaisuus ennen jokaista maxheapify:n kutsua. Mutta miten koko puusta saadaan maksimikeko, algoritmihan laittaa vain yhden solmun paikalleen? Vastaus: Käymällä koko puu tällä algoritmilla läpi lehdistä juureen päin, kukin solmu vuorollaan algoritmille välitettävänä solmuna i Puuta järjestetään lehdistä juureen päin, koska algoritmin toiminta perustuu siihen, että käsiteltävän solmun alipuut ovat kekoja maxheapify:n toiminta Kuva 3.3 havainnollistaa maxheapify -algoritmin toimintaa aiemmin esitellylle esimerkkikeolle aheap.size = 10, jossa nyt indeksillä 2 oleva alkio rikkoo maksimikeko-ominaisuuden. Algoritmia kutsutaan maxheapify(aheap, 2) Indeksistä 1 ei voi aloittaa, koska algoritmi olettaa, että vasen ja oikea lapsisolmu toteuttavat jo valmiiksi maksimikeko-ominaisuuden. Riveillä 5-11 haetaan muuttujan largest arvoksi vanhemman ja kahden lapsen joukosta suurimman alkion indeksi Riveillä pudotetaan alkio i alaspäin yhden tason verran (lapsien tasolle), jos se ei ollut suurin. Rivillä 15 kutsutaan algortimia rekursiivisesti, alkion pudottamiseksi vielä alaspäin (jos tarpeen)

15 Kuva 3.3: Kutsusta maxheapify(aheap, 2) seuraava toiminta vaiheittain: (a) Alkuperäinen keko, jossa alkio indeksillä 2 rikkoo maksimikekoominaisuuden. (b) Maksimikeko-ominaisuus on palautettu indeksille 2, mutta indeksillä 4 oleva alikeko on vielä järjestettävä, tämä voidaan tehdä kutsumalla algoritmia rekursiivisesti. (c) Maksimikeko-ominaisuus on nyt palautettu indeksille 4, ja seuraava rekursiivinen kutsu algoritmiin ei enää tuota muutoksia, koska aheap.size -rajoitus rikkoutuu maxheapify:n suoritusaika maxheapify -algoritmin suoritusaika kokoa n olevalle keolle (juurisolmu indeksillä i) koostuu kahdesta osasta: 1. Vakiosuoritus Θ(1) joka kuluu alkioiden aheap[i], aheap[aheap.getleftchild(i)] sekä aheap[aheap.getrightchild(i)] keskinäiseen järjestelyyn (huomaa ettei rekursion sisällä ole silmukoita). 2. Rekursiivinen kutsu alikeolle, jonka juurisolmu on jompikumpi indeksin i lapsista. Tälläin uuden alikeon suurin mahdollinen koko suhteessa edelliseen kekoon on 2n/3. Suoritukselle saadaan: T (n) T (2n/3) + Θ(1), joka kuuluu pääteoreeman (master theorem) toiseen luokkaan, jolloin asymptoottiseksi tehokuudeksi saadaan T (n) O(lg n). Vaihtoehtoisesti alkiolle jo-

16 ka sijaitsee korkeudella h, saadaan maxheapify -suoritusaika T (h) O(h), joka viittaa aiemmin esitettyyn keon korkeuden ja operaatioiden suoritusaikojen vastaavuuteen Kekojen rakentaminen Seuraavaksi tutkitaan, miten keosta aheap saadaan yleisessä tapauksessa rakennettua maksimikeko, eli binääripuu joka toteuttaa maksimikeko-ominaisuuden. Voidaan osoittaa: n alkiota sisältävän keon mallintavassa taulukossa alkiot aheap.data[floor(n/2)+1 : n+1] ovat kyseisen keon lehtisolmuja. Esimerkkitapauksessa keon koko on 10, jolloin ensimmäisen lehtisolmun indeksiksi saadaan 10/2 + 1 = 6. Jokainen näistä lehtisolmuista on omassa kontekstissaan atominen maksimikeko! Rakentaminen voidaan aloittaa indeksistä n/2 ja kutsua edellä esitettyä maxheapifyalgoritmia kaikille taulukon lehtisolmuja edeltäville alkioille. Näin saadaan määriteltyä uusi algoritmi, buildmaxheap(aheap), joka on esitelty alla: 1 buildmaxheap ( aheap ) : 2 for i = aheap. s i z e / 2 downto 1 3 maxheapify ( aheap, i ) Tämä algoritmi siis aloittaa taulukon viimeisestä lehtisolmuja edeltävästä solmusta ja peruuttaa kohti taulukon alkua. Toisin sanoen, algoritmi kiipeää alhaalta kohti puun juurisolmua buildmaxheap:in oikeellisuus buildmaxheap -algoritmin oikeellisuus voidaan tarkistaa sen silmukkainvariantin avulla, joka tässä tapauksessa on: For-silmukan jokaisen kierroksen alussa jokainen indeksien (i + 1) ja n välillä oleva taulukon aheap.data alkio on erään maksimikeon juurisolmu. Alustus: Ennen ensimmäistä for-silmukkaa indeksien n/2 + 1 ja n välillä olevat taulukon aheap.data alkiot ovat pelkkiä lehtisolmuja, joten ne ovat kaikki omassa kontekstissaan ns. atomisia maksimikekoja. Ylläpito: Ennen jokaista for-silmukan toistoa: Kaikki indeksin i oikealla puolella taulukossa olevat alkiot ovat omien maksimikekojensa juurisolmuja (kuten silmukkainvariantissa on todettu). Myäs indeksin i alkion vasen ja oikea lapsisolmu ovat omien maksimikekojensa juurisolmut (ne sijaitsevat taulukossa indeksin i oikealla puolella). Tämä on perusvaatimus maxheapify -algoritmin suoritukselle! For-silmukan toiston jälkeen myäs indeksillä i oleva alkio on maksimikeon juurisolmu. Indeksin i pienentäminen ennen seuraava silmukkaa alustaa silmukainvariantin.

17 Lopetus: for-silmukka lopettaa suorituksensa sen jälkeen, kun maxheapify(aheap, 1) on suoritettu taulukon 1. alkiolle. Tämä varmistaa, että taulukon aheap ensimmäinen alkio on sijoitettu omalle paikalleen keossa, jonka jälkeen koko taulukko on käyty läpi, ja taulukon kaikki alkiot toteuttavat maksimikeko-ominaisuuden buildmaxheap:in suoritusaika buildmaxheap -algoritmille voidaan suoraviivaisesti määrittää suoritusajan yläraja: Jokainen maxheapify -kutsu suorittuu ajassa O(lg n) Näitä suorituksia on O(n) kappaletta (vakiokerroin, tässä tapauksessa 1/2, voidaan jättää asymptoottisessa tarkastelussa pois). Näin ollen suoritusajalle saadaan: T (n) O(n lg n). Vaikka tämä tulos on eräs yläraja buildmaxheap-algoritmille, niin se ei ole asymptoottisesti tarkka! Koska tiedetään että maxheapify -algoritmin suoritusaika on aina riippuvainen järjestettävän alikeon korkeudesta, nyt voidaan todeta että suurin osa näistä alikeoista on korkeudeltaan suhteellisen matalia. Voidaan osoittaa että n alkiota sisältävän keon korkeus on aina lg n, ja että korkeudella h keossa on enintään n 2 h+1 alkiota. Nyt asymptoottisesti tarkaksi ylärajaksi saadaan: ( ) lg n n lg n h T (n) 2 h+1 O(h) = O n h 2 h = O n 2 h = O(n), h=0 h=0 jossa on huomattu että äärettämän sarjan summa on suurempi kuin äärellisen ja tämän jälkeen käytetty tulosta h=0 h 1/2 = 2 h (1 1/2), joka voidaan johtaa 2 (kokeile!) geometrisen sarjan derivaatan avulla. Tämän alaluvun tärkein viesti on siis: h=0 Maksimikeko voidaan rakentaa taulukosta lineaarisessa ajassa! Kekolajittelun algoritmi Ensimmäisenä kekojen sovellutuksena tässä kurssissa esitellään kekolajittelu. Kekolajittelu (heapsort(aheap)) -algoritmi rakentuu buildmaxheap(aheap) - algoritmin toiminnalle. Algoritmin järjestää annetun taulukon alkiot pienimmästä suurimpaan seuraavalla tavalla: 1. Järjestetään taulukko maksimikeoksi (init(aheap, array) ja buildmaxheap(aheap)).

18 2. Huomataan, että koska taulukon suurin alkio on nyt keon juurisolmu aheap.data[1], se voidaan asettaa oikealle paikalleen lajitellussa taulukossa vaihtamalla sen ja keon viimeisen alkion aheap.data[n] paikat keskenään. 3. Pienennetään keon kokoa yhdellä 4. Asetetaan uusi juurisolmu oikealle paikalleen keossa ( maxheapify(aheap, 1)). 5. Jos keon koko on suurempi kuin yksi, palataan kohtaan 2. Kekolajittelun pseudokoodi on esitetty alla: 1 heapsort ( aheap ) : 2 buildmaxheap ( aheap ) 3 for i = aheap. s i z e downto 2 4 aheap. data [ 1 ], aheap. data [ i ] = aheap. data [ i ], aheap. data [ 1 ] 5 aheap. s i z e = aheap. s i z e 1 6 maxheapify ( aheap, 1) Kekolajittelun oikeellisuus heapsort(aheap) -algoritmin silmukkainvariantti määräytyy nyt seuraavasti: For-silmukan jokaisen suorituskerran alussa alitaulukko aheap.data[1 : i] on maksimikeko, joka sisältää taulukon i pienintä elementtiä. Alitaulukko aheap.data[(i + 1) : n] puolestaan sisältää taulukon (n - i) suurinta elementtiä lajitellussa järjestyksessä. Alustus: Ennen ensimmäistä for-silmukkaa: Alitaulukko aheap.data[1 : i] sisältää kaikki taulukon alkiot maksimikeossa. Toinen alitaulukko puolestaan sisältää (n - i) = 0 alkiota, eli se on tyhjä. Ylläpito: Koodin suorituksesta huomataan: Koska jokaisen for -silmukan aluksi alitaulukon päissä olevat alkiot vaihdetaan keskenään, jäljellä oleva keko ei välttämättä toteuta maksimikekoominaisuutta, jolloin sille ei voi ajaa maxheapify -algoritmia. for -silmukan sisällä keon kokoa aheap.size pienennetään, jolloin taulukon päähän vaihdettu alkio suljetaan pois keon rakenteesta. Uuden juurisolmun molemmat lapset toteuttavat maksimikeko-ominaisuuden, ja poistettu alkio siirtyy alitaulukkoon aheap.data[(i + 1) : n] joka on lajitellussa järjestyksessä, koska sitä täydennetään oikealta vasemmalle maksimikekojen juurisolmujen alkioilla. Pienennetylle keolle suoritettu maxheapify -algoritmi alustaa silmukan seuraavalle kierrokselle.

19 Lopetus: for -silmukka suoritetaan viimeisen kerran, kun i = 2. Tämän jälkeen alitaulukko aheap.data[2 : n] sisältää yhtä vaille kaikki alkuperäisen taulukon alkiot lajitellussa järjestyksessä. Puuttuva alkio on aheap.data[1], joka on alkuperäisen taulukon pienin alkio. Koko taulukko on nyt lajitellussa järjestyksessä Kekolajittelun suoritusaika heapsort-algoritmin asymptoottinen suoritusaika voidaan suoraviivaisesti päätellä: Yksi buildmaxheap-algoritmin kutsu suorittuu O(n) ajassa, jonka lisäksi maxheapifyalgoritmin rekursiivinen suorittaminen kestää (n 1)O(lg n). Koska O-notaatioiden summasta asymptoottiseksi ylärajaksi voidaan erottaa korkein termi, heapsort -algoritmille saadaan: T (n) O(n lg n) Kuten luennon alussa mainittiin, heapsort-algoritmin toiminta perustuu tietorakenteen (tässä tapauksessa keon) rakentamiseen ja hallintaan. Kuten seuraavissa luennoissa tullaan huomaamaan, tietorakenteen ja algoritmin yhteistoiminta on yksi tehokkaiden algoritmien perusominaisuuksista, ja algoritmin toimintaa voidaan usein tehostaa käyttämällä mahdollisimman hyvin suoritukseen soveltuvaa tietorakennetta (tai suunnittelemalla sellainen).

20 3.3. Lajittelualgoritmien suorituskyvyn rajoista Kun on n alkiota lajiteltavana, ne voivat alussa olla n! erilaisessa järjestyksessä. Vertailuun perustuvaa lajittelualgoritmia voidaan tarkastella binääripuuna, jossa solmut vastaavat vertailuja. Tällöin polku juuresta lehteen kuvaa lajittelussa tehtyjä vertailuja, jolloin lehti kertoo mihin järjestykseen juuri näillä vertailuilla ja niiden tuloksilla syöte päätyy. Seuraava kuva hahmottaa tilannetta: 1? 2 > 2? 3 1? 3 > > <1,2,3> 1? 3 <2,1,3> 2? 3 > > <1,3,2> <3,1,2> <2,3,1> <3,2,1> Kuva 2.1. Päätöspuu eräälle kolmen alkion (a1,a2,a3) lajitteluun tarkoitetulle algoritmille. Yllä merkintä i? j tarkoittaa vertailua alkioiden ai ja aj välillä. Puu haarautuu vertailun tuloksen mukaan. Puun lehti ilmaisee alkioiden järjestyksen, esimerkiksi <3,1,2> tarkoittaa, että alkioiden suuruusjärjestys on a3 a1 a2. Koska kolme alkiota voi olla 6 (= 3!) eri järjestyksessä, puussa on oltava vähintään kuusi lehteä. Olkoon taulukossa n alkiota ja olkoon A jokin vertailuun perustuva lajittelualgoritmi. Tällöin lajittelualgoritmia A vastaavassa puussa on oltava vähintään n! lehteä. Oletetaan, että puun syvyys on s: tällöin on olemassa sellainen taulukon alkujärjestys, että joudutaan tekemään s vertailua ennen kuin taulukko on järjestyksessä. Siten algoritmin kompleksisuus on s huonoimmassa tapauksessa s. Koska kyseessä on binääripuu, siinä on korkeintaan 2 lehteä. Siis, jotta jokaista alkujärjestystä vastaisi puun lehti, on oltava s n! 2 lg( n! ) s Koska luvun n kertomassa n! on vähintään n/2 lukua suuruudeltaan ainakin n/2, on selvää että n! ( n/ 2) ( n / 2) lg( n!) ( n/ 2)lg( n/ 2) (1/ 2) nlg n ( n/ 2) joten s ( 1/ 2) nlg n ( n/ 2) ( n lg n).

21 Näin ollen vertailuun perustuvan lajittelualgoritmin kompleksisuus on vähintään luokkaa nlg n. Siten lomituslajittelu ja pikalajittelu ovat kompleksisuudeltaan optimaalisia. On olemassa lajittelualgoritmeja, jotka toimivat nopeammin, esimerkiksi lineaarisessa ajassa. Edellä olevan tarkastelun mukaan ne perustuvat johonkin muuhun kuin pelkkään alkioiden vertailuun. Tällainen algoritmi on esimerkiksi laskentalajittelu, joka vaatii esitietona alkioiden ala- ja ylärajan (ks. [Cor], kappale 8.2). Tällöin voidaan laskemalla pitää tietoa siitä kuinka moni alkio on annettua alkiota pienempi ja saadaan taulukko järjestettyä lineaarisessa ajassa. Oletetaan, että luvut ovat väliltä [0,k], missä k on jokin positiivinen vakio. Seuraavassa laskentalajittelualgoritmi: Syöte: Taulukko A[1,..,n], n >= 1, luku k >= max(a) Tulostus: Taulukko B[1,..,n], jossa A:n alkiot suuruusjärjestyksessä LASKENTAAJITTELU(A,k) 1. varaa taulukko B[1,..,n] 2. varaa taulukko C[0,..k] // Väliaikainen työtaulukko 3. for i=0 to k 4. C[i] = 0 5. for j=1 to length(a) 6. C[A[j]] = C[A[j]]+1 // Taulukossa C[i] on niiden A:n alkioiden lukumäärä, jotka // yhtäsuuria kuin i 7. for i=1 to k 8. C[i] = C[i]+C[i-1] // Nyt taulukossa C[i] on niiden A:n alkioiden lukumäärä, jotka ovat // pienempiä tai yhtäsuuria kuin i // Seuraavaksi sijoitetaan A:n alkiot kerralla oikeaan kohtaan // taulukossa B 9. for j = length(a) downto B[C[A[j]]] = A[j] 11. C[A[j]] = C[A[j]] return B Esimerkki. Olkoon lajiteltava taulukko A: Silloin aputaulukon C indeksit ovat 0 4 ja rivin 8 suorituksen jälkeen taulukon C paikalla i on arvon i esiintymien lukumäärä taulukossa A. Siis C: Tämän jälkeen lasketaan taulukossa C peräkkäiset arvot yhteen vasemmalta alkaen, minkä jälkeen taulukossa C indeksi i kertoo taulukossa A arvoa i pienempien tai yhtäsuurien arvojen lukumäärän:

22 C: Täten taulukkoon B voidaan sijoittaa A:n alkiot heti oikealle paikalle, kun käydään taulukko A läpi. Riviltä 12 alkavan silmukan ensimmäisen kierroksen jälkeen (A[6] = 2, C[2] = 2) B: C: Nyt luku 2 on oikealla paikalla taulukossa B. Seuraavalla kierroksella (A[5] = 4, C[4] = 6) B: C: Näin jatkamalla saadaan kaikki taulukon A alkiot taulukkoon B oikealla paikalle. Lopussa B: C: Koska algoritmi käy taulukon A kahdesti läpi samoin kuin taulukon C, algoritmin kompleksisuus on luokkaa ( n k), missä n on taulukon A koko ja k taulukon A suurin alkio (kun oletetaan että A ei sisällä negatiivisia lukuja). Lähteet: [Cor] Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C. Introduction to Algorithms, 2 nd edition, The MIT Press 2001.

1 Puu, Keko ja Prioriteettijono

1 Puu, Keko ja Prioriteettijono TIE-20100 Tietorakenteet ja algoritmit 1 1 Puu, Keko ja Prioriteettijono Tässä luvussa käsitellään algoritmien suunnitteluperiaatetta muunna ja hallitse (transform and conquer) Lisäksi esitellään binääripuun

Lisätiedot

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

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia Kukin alkio (viite) talletettuna solmuun (node) vastaa paikan käsitettä

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PUURAKENTEET, BINÄÄRIPUU, TASAPAINOTETUT PUUT MIKÄ ON PUUTIETORAKENNE? Esim. Viereinen kuva esittää erästä puuta. Tietojenkäsittelytieteessä puut kasvavat alaspäin.

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

8. Lajittelu, joukot ja valinta

8. Lajittelu, joukot ja valinta 8. Lajittelu, joukot ja valinta Yksi tietojenkäsittelyn klassisista tehtävistä on lajittelu (järjestäminen) (sorting) jo mekaanisten tietojenkäsittelylaitteiden ajalta. Lajiteltua tietoa tarvitaan lukemattomissa

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

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

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

1 Erilaisia tapoja järjestää

1 Erilaisia tapoja järjestää TIE-20100 Tietorakenteet ja algoritmit 1 1 Erilaisia tapoja järjestää Käsitellään seuraavaksi järjestämisalgoritmeja, jotka perustuvat muihin kuin vertailuun alkioiden oikean järjestyksen saamiseksi. Lisäksi

Lisätiedot

Tiraka, yhteenveto tenttiinlukua varten

Tiraka, yhteenveto tenttiinlukua varten Tiraka, yhteenveto tenttiinlukua varten TERMEJÄ Tietorakenne Tietorakenne on tapa tallettaa tietoa niin, että tietoa voidaan lisätä, poistaa, muokata ja hakea. Tietorakenteet siis säilövät tiedon niin,

Lisätiedot

Tutkimusmenetelmät-kurssi, s-2004

Tutkimusmenetelmät-kurssi, s-2004 Algoritmitutkimuksen menetelmistä Tutkimusmenetelmät-kurssi, s-2004 Pekka Kilpeläinen Kuopion yliopisto Tietojenkäsittelytieteen laitos Algoritmitutkimuksen menetelmistä p.1/20 Sisällys Tänään Tietojenkäsittelytiede

Lisätiedot

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto 811312A Tietorakenteet ja algoritmit 2015-2016 I Johdanto Sisältö 1. Algoritmeista ja tietorakenteista 2. Algoritmien analyysistä 811312A TRA, Johdanto 2 I.1. Algoritmeista ja tietorakenteista I.1.1. Algoritmien

Lisätiedot

Algoritmit 1. Luento 10 Ke 11.2.2015. Timo Männikkö

Algoritmit 1. Luento 10 Ke 11.2.2015. Timo Männikkö Algoritmit 1 Luento 10 Ke 11.2.2015 Timo Männikkö Luento 10 Algoritminen ongelman ratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Väliinsijoituslajittelu Valintalajittelu

Lisätiedot

10. Painotetut graafit

10. Painotetut graafit 10. Painotetut graafit Esiintyy monesti sovelluksia, joita on kätevä esittää graafeina. Tällaisia ovat esim. tietoverkko tai maantieverkko. Näihin liittyy erinäisiä tekijöitä. Tietoverkkoja käytettäessä

Lisätiedot

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

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: Tietorakenteet, laskuharjoitus 10, ratkaisuja 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: SamaLuku(T ) 2 for i = 1 to T.length 1 3 if T [i] == T [i + 1] 4 return True 5 return

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 11.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 11.2.2009 1 / 33 Kertausta: listat Tyhjä uusi lista luodaan kirjoittamalla esimerkiksi lampotilat = [] (jolloin

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

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat

Lisätiedot

811312A Tietorakenteet ja algoritmit 2015-2016. V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

811312A Tietorakenteet ja algoritmit 2015-2016. V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit 811312A Tietorakenteet ja algoritmit 2015-2016 V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit Sisältö 1. Johdanto 2. Leveyshaku 3. Syvyyshaku 4. Kruskalin algoritmi 5. Dijkstran algoritmi

Lisätiedot

Algoritmit 1. Luento 14 Ke 25.2.2015. Timo Männikkö

Algoritmit 1. Luento 14 Ke 25.2.2015. Timo Männikkö Algoritmit 1 Luento 14 Ke 25.2.2015 Timo Männikkö Luento 14 Heuristiset menetelmät Heuristiikkoja kapsäkkiongelmalle Kauppamatkustajan ongelma Lähimmän naapurin menetelmä Kertaus ja tenttivinkit Algoritmit

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 7.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 7.2.2011 1 / 39 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä Luku 7 Verkkoalgoritmit Verkot soveltuvat monenlaisten ohjelmointiongelmien mallintamiseen. Tyypillinen esimerkki verkosta on tieverkosto, jonka rakenne muistuttaa luonnostaan verkkoa. Joskus taas verkko

Lisätiedot

v 8 v 9 v 5 C v 3 v 4

v 8 v 9 v 5 C v 3 v 4 Verkot Verkko on (äärellinen) matemaattinen malli, joka koostuu pisteistä ja pisteitä toisiinsa yhdistävistä viivoista. Jokainen viiva yhdistää kaksi pistettä, jotka ovat viivan päätepisteitä. Esimerkiksi

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

3.3 Paraabeli toisen asteen polynomifunktion kuvaajana. Toisen asteen epäyhtälö

3.3 Paraabeli toisen asteen polynomifunktion kuvaajana. Toisen asteen epäyhtälö 3.3 Paraabeli toisen asteen polynomifunktion kuvaajana. Toisen asteen epäyhtälö Yhtälön (tai funktion) y = a + b + c, missä a 0, kuvaaja ei ole suora, mutta ei ole yhtälökään ensimmäistä astetta. Funktioiden

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT ALGORITMIEN ANALYYSISTÄ 1.ratkaisu Laskentaaika hakkeri - optimoitu ALGORITMIANALYYSIÄ hyvä algoritmi hakkeri -optimoitu hyvä algoritmi Tehtävän koko Kuva mukailtu

Lisätiedot

2 Yhtälöitä ja epäyhtälöitä

2 Yhtälöitä ja epäyhtälöitä 2 Yhtälöitä ja epäyhtälöitä 2.1 Ensimmäisen asteen yhtälö ja epäyhtälö Muuttujan x ensimmäisen asteen yhtälöksi sanotaan yhtälöä, joka voidaan kirjoittaa muotoon ax + b = 0, missä vakiot a ja b ovat reaalilukuja

Lisätiedot

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä Sisällys 11. Javan toistorakenteet Laskuri- ja lippumuuttujat.. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin lopettaminen break-lauseella.

Lisätiedot

Koe ma 1.3 klo 16-19 salissa A111, koeaika kuten tavallista 2h 30min

Koe ma 1.3 klo 16-19 salissa A111, koeaika kuten tavallista 2h 30min Koe Koe ma 1.3 klo 16-19 salissa A111, koeaika kuten tavallista 2h 30min Kokeessa saa olla mukana A4:n kokoinen kaksipuolinen käsiten tehty, itse kirjoitettu lunttilappu 1 Tärkeää ja vähemmäntärkeää Ensimmäisen

Lisätiedot

1. Johdanto. 1.1. Algoritmeista ja tietorakenteista

1. Johdanto. 1.1. Algoritmeista ja tietorakenteista 1. Johdanto Tietojenkäsittelytieteen olennaisimpia osia on abstraktio: Käsiteltävään ongelmaan on löydettävä sopiva malli, jota voidaan käsitellä tietokoneella. Malliin liittyvät ongelmaan sopivat tietorakenteet

Lisätiedot

1 Aritmeettiset ja geometriset jonot

1 Aritmeettiset ja geometriset jonot 1 Aritmeettiset ja geometriset jonot Johdatus Johdatteleva esimerkki 1 Kasvutulille talletetaan vuoden jokaisen kuukauden alussa tammikuusta alkaen 100 euroa. Tilin nettokorkokanta on 6%. Korko lisätään

Lisätiedot

Insinöörimatematiikka A

Insinöörimatematiikka A Insinöörimatematiikka A Demonstraatio 3, 3.9.04 Tehtävissä 4 tulee käyttää Gentzenin järjestelmää kaavojen johtamiseen. Johda kaava φ (φ ) tyhjästä oletusjoukosta. ) φ ) φ φ 3) φ 4) φ (E ) (E ) (I, ) (I,

Lisätiedot

Talousmatematiikan perusteet, L3 Prosentti, yhtälöt Aiheet

Talousmatematiikan perusteet, L3 Prosentti, yhtälöt Aiheet Talousmatematiikan perusteet, L3 Prosentti, t Toisen Prosentti 1 Jos b on p% luvusta a, eli niin b = p 100 a a = perusarvo (Mihin verrataan?) (Minkä sadasosista on kysymys.) p = prosenttiluku (Miten monta

Lisätiedot

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu Taulukot Taulukon määrittely ja käyttö Taulukko metodin parametrina Taulukon sisällön kopiointi toiseen taulukkoon Taulukon lajittelu esimerkki 2-ulottoisesta taulukosta 1 Mikä on taulukko? Taulukko on

Lisätiedot

Laskennan vaativuus ja NP-täydelliset ongelmat

Laskennan vaativuus ja NP-täydelliset ongelmat Laskennan vaativuus ja NP-täydelliset ongelmat TRAK-vierailuluento 13.4.2010 Petteri Kaski Tietojenkäsittelytieteen laitos Tietojenkäsittelytiede Tietojenkäsittelytiede tutkii 1. mitä tehtäviä voidaan

Lisätiedot

Pienin virittävä puu (minimum spanning tree)

Pienin virittävä puu (minimum spanning tree) Pienin virittävä puu (minimum spanning tree) Jatkossa puu tarkoittaa vapaata puuta (ks. s. 11) eli suuntaamatonta verkkoa, joka on yhtenäinen: minkä tahansa kahden solmun välillä on polku syklitön: minkä

Lisätiedot

Pyramidi 9 Trigonometriset funktiot ja lukujonot 15.4.2011 HK1-1. Dsin3 x. 3cos3x. Dsinx. u( x) sinx ja u ( x) cosx. Dsin. Dsin

Pyramidi 9 Trigonometriset funktiot ja lukujonot 15.4.2011 HK1-1. Dsin3 x. 3cos3x. Dsinx. u( x) sinx ja u ( x) cosx. Dsin. Dsin Pyramidi 9 Trigonometriset funktiot ja lukujonot 5.4.0 HK- a) Dsin3 us ( ) cos3 3 us( ) s( ) 3cos3 s( ) 3 ja s( ) 3 u( ) sin ja u( ) cos b) Dsin 3 3 Dsin us ( ) s( ) sin ja s( ) cos 3 u( ) ja u( ) 3 3sin

Lisätiedot

MAY1 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty 12.4.2016 Julkaiseminen sallittu vain koulun suljetussa verkossa.

MAY1 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty 12.4.2016 Julkaiseminen sallittu vain koulun suljetussa verkossa. KERTAUS Lukujono KERTAUSTEHTÄVIÄ K1. Ratkaisussa annetaan esimerkit mahdollisista säännöistä. a) Jatketaan lukujonoa: 2, 4, 6, 8, 10, 12, 14, 16, Rekursiivinen sääntö on, että lukujonon ensimmäinen jäsen

Lisätiedot

Harjoitus 3 (31.3.2015)

Harjoitus 3 (31.3.2015) Harjoitus (..05) Tehtävä Olkoon kaaren paino c ij suurin sallittu korkeus tieosuudella (i,j). Etsitään reitti solmusta s solmuun t siten, että reitin suurin sallittu korkeus pienimmillään olisi mahdollisimman

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015

TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015 TIEA241 Automaatit ja, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. joulukuuta 2015 Sisällys Formaalisti Määritelmä Nelikko G = (V, Σ, P, S) on kontekstiton kielioppi (engl. context-free

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 16.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 1 / 26 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006 TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa

Lisätiedot

Helsingin, Jyväskylän, Oulun, Tampereen ja Turun yliopisto Matematiikan valintakoe 9.6.2014 klo 10 13

Helsingin, Jyväskylän, Oulun, Tampereen ja Turun yliopisto Matematiikan valintakoe 9.6.2014 klo 10 13 Helsingin, Jyväskylän, Oulun, Tampereen ja Turun yliopisto Matematiikan valintakoe 9.6.014 klo 10 13 1. Ratkaise seuraavat yhtälöt ja epäyhtälöt: x + a) 3 x + 1 > 0 c) x x + 1 = 1 x 3 4 b) e x + e x 3

Lisätiedot

1.1 Tavallinen binäärihakupuu

1.1 Tavallinen binäärihakupuu TIE-20100 Tietorakenteet ja algoritmit 1 1 Puurakenteet http://imgur.com/l77fy5x Tässä luvussa käsitellään erilaisia yleisiä puurakenteita. ensin käsitellään tavallinen binäärihakupuu sitten tutustutaan

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 27.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 27.1.2010 1 / 37 If-käsky toistokäskyn sisällä def main(): HELLERAJA = 25.0 print "Anna lampotiloja, lopeta -300:lla."

Lisätiedot

Ratkaisu: a) Aritmeettisen jonon mielivaltainen jäsen a j saadaan kaavalla. n = a 1 n + (n 1)n d = 5 500 + 4 = 501500. 2 500 = 5 + 2001 2

Ratkaisu: a) Aritmeettisen jonon mielivaltainen jäsen a j saadaan kaavalla. n = a 1 n + (n 1)n d = 5 500 + 4 = 501500. 2 500 = 5 + 2001 2 Kotitehtäviä 5. Ratkaisuehdotuksia. a) Jono a,..., a 500 on aritmeettinen, a = 5 ja erotusvakio d = 4. Laske jäsenet a, a 8 ja a 00 sekä koko jonon summa. b) Jono b,..., b 0 on geometrinen, b = ja suhdeluku

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 21.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 21.9.2015 1 / 25 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

ORMS2020 Päätöksenteko epävarmuuden vallitessa Syksy 2008. päätöspuiden avulla tarkastellaan vasta seuraavissa harjoituksissa.

ORMS2020 Päätöksenteko epävarmuuden vallitessa Syksy 2008. päätöspuiden avulla tarkastellaan vasta seuraavissa harjoituksissa. ORMS00 Päätöksenteko epävarmuuden vallitessa Syksy 008 Harjoitus Ratkaisuehdotuksia Nämä harjoitukset liittyvät päätöspuiden rakentamiseen: varsinaista päätöksentekoa päätöspuiden avulla tarkastellaan

Lisätiedot

1.4 Funktion jatkuvuus

1.4 Funktion jatkuvuus 1.4 Funktion jatkuvuus Kun arkikielessä puhutaan jonkin asian jatkuvuudesta, mielletään asiassa olevan jonkinlaista yhtäjaksoisuutta, katkeamattomuutta. Tässä ei kuitenkaan käsitellä työasioita eikä ihmissuhteita,

Lisätiedot

1 Raja-arvo. 1.1 Raja-arvon määritelmä. Raja-arvo 1

1 Raja-arvo. 1.1 Raja-arvon määritelmä. Raja-arvo 1 Raja-arvo Raja-arvo Raja-arvo kuvaa funktion f arvon f() kättätmistä, kun vaihtelee. Joillakin funktioilla f() muuttuu vain vähän, kun muuttuu vähän. Toisilla funktioilla taas f() hppää tai vaihtelee arvaamattomasti,

Lisätiedot

Nollasummapelit ja bayesilaiset pelit

Nollasummapelit ja bayesilaiset pelit Nollasummapelit ja bayesilaiset pelit Kristian Ovaska HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Seminaari: Peliteoria Helsinki 18. syyskuuta 2006 Sisältö 1 Johdanto 1 2 Nollasummapelit 1 2.1

Lisätiedot

1 Kannat ja kannanvaihto

1 Kannat ja kannanvaihto 1 Kannat ja kannanvaihto 1.1 Koordinaattivektori Oletetaan, että V on K-vektoriavaruus, jolla on kanta S = (v 1, v 2,..., v n ). Avaruuden V vektori v voidaan kirjoittaa kannan vektorien lineaarikombinaationa:

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

etunimi, sukunimi ja opiskelijanumero ja näillä

etunimi, sukunimi ja opiskelijanumero ja näillä Sisällys 1. Algoritmi Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.1 1.2 Algoritmin määritelmä Ohjelmointi

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.2.2011 1 / 37 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

Harjoitus 3 (3.4.2014)

Harjoitus 3 (3.4.2014) Harjoitus 3 (3..) Tehtävä Olkoon kaaren paino c ij suurin sallittu korkeus tieosuudella (i, j). Etsitään reitti solmusta s solmuun t siten, että reitin suurin sallittu korkeus pienimmillään olisi mahdollisimman

Lisätiedot

1.1. Ympäristön ja raja-arvon käsite

1.1. Ympäristön ja raja-arvon käsite .. Ympäristön ja raja-arvon käsite Matematiikan opintojen tässä vaiheessa aletaan olla kiinnostavimpien sisältöjen laidassa. Tähänastiset pitkän matematiikan opinnot ovat olleet kuin valmistelua, jatkossa

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 26.1.2011 T-106.1208 Ohjelmoinnin perusteet Y 26.1.2011 1 / 34 Luentopalaute kännykällä käynnissä! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti Vast

Lisätiedot

5.3 Ensimmäisen asteen polynomifunktio

5.3 Ensimmäisen asteen polynomifunktio Yllä olevat polynomit P ( x) = 2 x + 1 ja Q ( x) = 2x 1 ovat esimerkkejä 1. asteen polynomifunktioista: muuttujan korkein potenssi on yksi. Yleisessä 1. asteen polynomifunktioissa on lisäksi vakiotermi;

Lisätiedot

Valmistelut: Aseta kartiot numerojärjestykseen pienimmästä suurimpaan (alkeisopiskelu) tai sekalaiseen järjestykseen (pidemmälle edenneet oppilaat).

Valmistelut: Aseta kartiot numerojärjestykseen pienimmästä suurimpaan (alkeisopiskelu) tai sekalaiseen järjestykseen (pidemmälle edenneet oppilaat). Laske kymmeneen Tavoite: Oppilaat osaavat laskea yhdestä kymmeneen ja kymmenestä yhteen. Osallistujamäärä: Vähintään 10 oppilasta kartioita, joissa on numerot yhdestä kymmeneen. (Käytä 0-numeroidun kartion

Lisätiedot

Kombinatorinen optimointi

Kombinatorinen optimointi Kombinatorinen optimointi Sallittujen pisteiden lukumäärä on äärellinen Periaatteessa ratkaisu löydetään käymällä läpi kaikki pisteet Käytännössä lukumäärä on niin suuri, että tämä on mahdotonta Usein

Lisätiedot

Mediaanisuodattimet. Tähän asti käsitellyt suodattimet ovat olleet lineaarisia. Niille on tyypillistä, että. niiden ominaisuudet tunnetaan hyvin

Mediaanisuodattimet. Tähän asti käsitellyt suodattimet ovat olleet lineaarisia. Niille on tyypillistä, että. niiden ominaisuudet tunnetaan hyvin Mediaanisuodattimet Tähän asti käsitellyt suodattimet ovat olleet lineaarisia. Niille on tyypillistä, että niiden ominaisuudet tunnetaan hyvin niiden analysointiin on olemassa vakiintuneita menetelmiä

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

Zeon PDF Driver Trial

Zeon PDF Driver Trial Matlab-harjoitus 2: Kuvaajien piirto, skriptit ja funktiot. Matlabohjelmoinnin perusteita Numeerinen integrointi trapezoidaalimenetelmällä voidaan tehdä komennolla trapz. Esimerkki: Vaimenevan eksponentiaalin

Lisätiedot

5.2 Ensimmäisen asteen yhtälö

5.2 Ensimmäisen asteen yhtälö 5. Ensimmäisen asteen ytälö 5. Ensimmäisen asteen yhtälö Aloitetaan antamalla nimi yhtälön osille. Nyt annettavat nimet eivät riipu yhtälön tyypistä tai asteesta. Tarkastellaan seuraavaa yhtälöä. Emme

Lisätiedot

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen

Lisätiedot

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Sisällys 3. Pseudokoodi Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Ohjausrakenteet: Valinta if- ja if--rakenteilla. oisto while-, do-while- ja for-rakenteilla. 3.1 3.2 Johdanto

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 16.2.2010 1 / 41 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

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

FYSA242 Statistinen fysiikka, Harjoitustentti

FYSA242 Statistinen fysiikka, Harjoitustentti FYSA242 Statistinen fysiikka, Harjoitustentti Tehtävä 1 Selitä lyhyesti: a Mikä on Einsteinin ja Debyen kidevärähtelymallien olennainen ero? b Mikä ero vuorovaikutuksessa ympäristön kanssa on kanonisella

Lisätiedot

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA 9.2.2011

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA 9.2.2011 PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA 9..0 Kokeessa saa vastata enintään kymmeneen tehtävään.. Sievennä a) 9 x x 6x + 9, b) 5 9 009 a a, c) log 7 + lne 7. Muovailuvahasta tehty säännöllinen tetraedri muovataan

Lisätiedot

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään Ohjelmointi Ohjelmoinnissa koneelle annetaan tarkkoja käskyjä siitä, mitä koneen tulisi tehdä. Ohjelmointikieliä on olemassa useita satoja. Ohjelmoinnissa on oleellista asioiden hyvä suunnittelu etukäteen.

Lisätiedot

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne. Proseduurit Proseduuri voi olla 1) Funktio, joka palauttaa jonkin arvon: real function sinc(x) real x sinc = sin(x)/x... y = sinc(1.5) 2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma

Lisätiedot

Parinmuodostuksesta tietojenkäsittelytieteen silmin. Petteri Kaski Tietojenkäsittelytieteen laitos Aalto-yliopisto

Parinmuodostuksesta tietojenkäsittelytieteen silmin. Petteri Kaski Tietojenkäsittelytieteen laitos Aalto-yliopisto Parinmuodostuksesta tietojenkäsittelytieteen silmin Petteri Kaski Tietojenkäsittelytieteen laitos Aalto-yliopisto Suomalainen Tiedeakatemia Nuorten Akatemiaklubi 18.10.2010 Sisältö Mitä tietojenkäsittelytieteessä

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

Lukion. Calculus. Funktiot ja yhtälöt. Paavo Jäppinen Alpo Kupiainen Matti Räsänen Otava PIKATESTIN JA KERTAUSKOKEIDEN TEHTÄVÄT RATKAISUINEEN

Lukion. Calculus. Funktiot ja yhtälöt. Paavo Jäppinen Alpo Kupiainen Matti Räsänen Otava PIKATESTIN JA KERTAUSKOKEIDEN TEHTÄVÄT RATKAISUINEEN Calculus Lukion MAA Funktiot ja yhtälöt Paavo Jäppinen Alpo Kupiainen Matti Räsänen Otava PIKATESTIN JA KERTAUSKOKEIDEN TEHTÄVÄT RATKAISUINEEN Funktiot ja yhtälöt (MAA) Pikatesti ja kertauskokeet Pikatesti

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 3.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 3.2.2010 1 / 36 Esimerkki: asunnon välityspalkkio Kirjoitetaan ohjelma, joka laskee kiinteistönvälittäjän asunnon

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 24.1.2011 T-106.1208 Ohjelmoinnin perusteet Y 24.1.2011 1 / 36 Luentopalaute kännykällä alkaa tänään! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti Vast

Lisätiedot

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin. 2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet

Lisätiedot

Matematiikan mestariluokka, syksy 2009 7

Matematiikan mestariluokka, syksy 2009 7 Matematiikan mestariluokka, syksy 2009 7 2 Alkuluvuista 2.1 Alkuluvut Määritelmä 2.1 Positiivinen luku a 2 on alkuluku, jos sen ainoat positiiviset tekijät ovat 1 ja a. Jos a 2 ei ole alkuluku, se on yhdistetty

Lisätiedot

rm + sn = d. Siispä Proposition 9.5(4) nojalla e d.

rm + sn = d. Siispä Proposition 9.5(4) nojalla e d. 9. Renkaat Z ja Z/qZ Tarkastelemme tässä luvussa jaollisuutta kokonaislukujen renkaassa Z ja todistamme tuloksia, joita käytetään jäännösluokkarenkaan Z/qZ ominaisuuksien tarkastelussa. Jos a, b, c Z ovat

Lisätiedot

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, että se pystyy suorittamaan kaikki mahdolliset algoritmit?

Lisätiedot

Helsingin, Itä-Suomen, Jyväskylän, Oulun, Tampereen ja Turun yliopisto Matematiikan valintakoe 11.6.2012 klo 10 13 Ratkaisut ja pisteytysohjeet

Helsingin, Itä-Suomen, Jyväskylän, Oulun, Tampereen ja Turun yliopisto Matematiikan valintakoe 11.6.2012 klo 10 13 Ratkaisut ja pisteytysohjeet Helsingin, Itä-Suomen, Jyväskylän, Oulun, Tampereen ja Turun yliopisto Matematiikan valintakoe 11.6.01 klo 10 13 t ja pisteytysohjeet 1. Ratkaise seuraavat yhtälöt ja epäyhtälöt. (a) 3 x 3 3 x 1 4, (b)

Lisätiedot

SSL syysseminaari 29.10.2013 Juha Hyssälä

SSL syysseminaari 29.10.2013 Juha Hyssälä SSL syysseminaari 29.10.2013 Juha Hyssälä Lääketieteellisessä tutkimuksessa on perinteisesti käytetty elinaika-analyysissä Coxin suhteellisen vaaran mallia ja/tai tämän johdannaisia. Kyseinen malli kuitenkin

Lisätiedot

Stabilointi. arvosana. arvostelija. Marja Hassinen

Stabilointi. arvosana. arvostelija. Marja Hassinen hyväksymispäivä arvosana arvostelija Stabilointi Marja Hassinen Helsinki 28.10.2007 Hajautetut algoritmit -seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Sisältö 1 1 Johdanto 1 2 Resynkroninen

Lisätiedot

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion. Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion. Vastaavuus puolestaan on erikoistapaus relaatiosta.

Lisätiedot

Hieman joukko-oppia. A X(A a A b A a b).

Hieman joukko-oppia. A X(A a A b A a b). Hieman joukko-oppia Seuraavassa esittelen hieman alkeellista joukko-oppia. Päämääränäni on saada käyttöön hyvinjärjestyslause, jota tarvitsemme myöhemmin eräissä todistuksissa. Esitykseni on aika, vaikkei

Lisätiedot

Preliminäärikoe Tehtävät Pitkä matematiikka 4.2.2014 1 / 3

Preliminäärikoe Tehtävät Pitkä matematiikka 4.2.2014 1 / 3 Preliminäärikoe Tehtävät Pitkä matematiikka / Kokeessa saa vastata enintään kymmeneen tehtävään Tähdellä (* merkittyjen tehtävien maksimipistemäärä on 9, muiden tehtävien maksimipistemäärä on 6 Jos tehtävässä

Lisätiedot

Reaalifunktioista 1 / 17. Reaalifunktioista

Reaalifunktioista 1 / 17. Reaalifunktioista säilyy 1 / 17 säilyy Jos A, B R, niin funktiota f : A B sanotaan (yhden muuttujan) reaalifunktioksi. Tällöin karteesinen tulo A B on (aiempia esimerkkejä luonnollisemmalla tavalla) xy-tason osajoukko,

Lisätiedot

Numeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin:

Numeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin: A Numeropeli Numeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin: 1 2 3 4 5 6 7 8 9 Voit jokaisella siirrolla vaihtaa keskenään kaksi vierekkäistä lukua vaaka- tai

Lisätiedot

Luento 5. Timo Savola. 28. huhtikuuta 2006

Luento 5. Timo Savola. 28. huhtikuuta 2006 UNIX-käyttöjärjestelmä Luento 5 Timo Savola 28. huhtikuuta 2006 Osa I Shell-ohjelmointi Ehtolause Lausekkeet suoritetaan jos ehtolausekkeen paluuarvo on 0 if ehtolauseke then lauseke

Lisätiedot

määrittelyjoukko. 8 piirretään tangentti pisteeseen, jossa käyrä leikkaa y-akselin. Määritä tangentin yhtälö.

määrittelyjoukko. 8 piirretään tangentti pisteeseen, jossa käyrä leikkaa y-akselin. Määritä tangentin yhtälö. MAA8 Juuri- ja logaritmifunktiot 5.4.0 Jussi Tyni. a) Derivoi f ( ) 3e 5 Mikä on funktion f () = ln(5 ) 00 määrittelyjoukko. c) Derivoi g( t) 4ln( t t ). Käyrälle g( ) e 8 piirretään tangentti pisteeseen,

Lisätiedot

jakokulmassa x 4 x 8 x 3x

jakokulmassa x 4 x 8 x 3x Laudatur MAA ratkaisut kertausarjoituksiin. Polynomifunktion nollakodat 6 + 7. Suoritetaan jakolasku jakokulmassa 5 4 + + 4 8 6 6 5 4 + 0 + 0 + 0 + 0+ 6 5 ± 5 5 4 ± 4 4 ± 4 4 ± 4 8 8 ± 8 6 6 + ± 6 Vastaus:

Lisätiedot

2 Haku ja lajittelu. 2.1 Luvun hakeminen taulukosta X?? n-1. Haku ja lajittelu 35

2 Haku ja lajittelu. 2.1 Luvun hakeminen taulukosta X?? n-1. Haku ja lajittelu 35 Haku ja lajittelu 35 2 Haku ja lajittelu Tässä luvussa käsitellään tiedon hakemista taulukosta sekä taulukon lajittelua. Useista erilaisista lajittelumenetelmistä on kirjaan otettu suurehko osa. Lajittelumenetelmien

Lisätiedot

3 Raja-arvo ja jatkuvuus

3 Raja-arvo ja jatkuvuus 3 Raja-arvo ja jatkuvuus 3. Raja-arvon käsite Raja-arvo kuvaa funktion kättätmistä jonkin lähtöarvon läheisdessä. Raja-arvoa tarvitaan toisinaan siksi, että funktion arvoa ei voida laskea kseisellä lähtöarvolla

Lisätiedot

Matemaatikot ja tilastotieteilijät

Matemaatikot ja tilastotieteilijät Matemaatikot ja tilastotieteilijät Matematiikka/tilastotiede ammattina Tilastotiede on matematiikan osa-alue, lähinnä todennäköisyyslaskentaa, mutta se on myös itsenäinen tieteenala. Tilastotieteen tutkijat

Lisätiedot

Kenguru 2012 Student sivu 1 / 8 (lukion 2. ja 3. vuosi)

Kenguru 2012 Student sivu 1 / 8 (lukion 2. ja 3. vuosi) Kenguru 2012 Student sivu 1 / 8 Nimi Ryhmä Pisteet: Kenguruloikan pituus: Irrota tämä vastauslomake tehtävämonisteesta. Merkitse tehtävän numeron alle valitsemasi vastausvaihtoehto. Väärästä vastauksesta

Lisätiedot

Ylioppilastutkintolautakunta S t u d e n t e x a m e n s n ä m n d e n

Ylioppilastutkintolautakunta S t u d e n t e x a m e n s n ä m n d e n Ylioppilastutkintolautakunta S t u d e n t e a m e n s n ä m n d e n MATEMATIIKAN KOE, LYHYT OPPIMÄÄRÄ..0 HYVÄN VASTAUKSEN PIIRTEITÄ Alla oleva vastausten piirteiden, sisältöjen ja pisteitsten luonnehdinta

Lisätiedot

3.11.2006. ,ܾ jaü on annettu niin voidaan hakea funktion 0.1 0.2 0.3 0.4

3.11.2006. ,ܾ jaü on annettu niin voidaan hakea funktion 0.1 0.2 0.3 0.4 Ü µ ½ ¾Ü¾µ Ü¾Ê 3.11.2006 1. Satunnaismuuttujan tiheysfunktio on ¼ ļ ܽ ܾ ÜÒµ Ä Ü½ ÜÒµ Ò Ä Ü½ ܾ ÜÒµ ܽ µ ܾ µ ÜÒ µ Ò missä tietenkin vaaditaan, että ¼. Muodosta :n ¾Ä ܽ ÜÒµ Ò ½¾ ܾ Ò ½ ¾Ü¾½µ ½ ¾Ü¾Òµ

Lisätiedot