Kierros 2: Järjestämisalgoritmeja

Koko: px
Aloita esitys sivulta:

Download "Kierros 2: Järjestämisalgoritmeja"

Transkriptio

1 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 CS-A4 / Autumn 7 / 6

2 Materiaali Kirjassa Introduction to Algorithms, rd ed. (online via Aalto lib): Lisäysjärjestäminen: kappaleet. ja. Lomitusjärjestäminen: kappale. Pikajärjestäminen: luku 7 Asymptoottisia alarajoja: kappale 8. Laskemis- ja kantalukujärjestäminen: kappaleet Huom. Tällä kierroksella esitetään muutama yleisin järjestämisalgoritmi. Näiden lisäksi on olemassa useita muitakin; esimerkiksi tälle wikipedia-sivulle on koottu eri algoritmeja ja niiden välinen vertailu ajoajan, vaaditun työmuistin jne suhteen. Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

3 Osittain vastaavia tekstejä muualla: Luku kirjassa Algorithms, 4th ed. OpenDSA Joitain netistä löytyviä videoluentoja ja visualisoiteja: MIT 6.6 OCW video on insertion and merge sorts MIT 6.6 OCW video on counting sort, radix sort and lower bounds for sorting and searching MIT OCW video on Quicksort, Randomized Algorithms MIT 6.46J 5 OCW video on Randomized Select and Randomized Quicksort 5 Sorting Algorithms in 6 Minutes video visualizations of comparison based sorting algorithms Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

4 Motivointi Datan järjestäminen on hyvin yleinen tehtävä: opintosuoritusten järjestäminen opiskelijanumeron perusteella, serverin lokitietojen läpikäynti aikajärjestyksessä,... Järjestämistä käytetään myös alirutiinina monessa muussa algoritmissa puolitushaku duplikaattialkioiden poistaminen datasta verkkojen läpikäyntialgoritmeissa... Järjestämiseen on onneksi hyvin tehokkaita algoritmeja Järjestäminen on melkein yhtä nopeaa kuin pelkkä datan sisäänlukeminen Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6

5 Asetelma Tarkastellaan sekvenssejä (yleensä taulukko) alkioita Alkioiden välillä on jokin järjestysrelaatio Jos alkiot ovat rakenteellisia olioita, sekvenssi sisältää Scalassa/Javassa viittauksia alkioihin. Tällöin kahden alkion paikan vaihtaminen (engl. swap) on tehokasta olion koosta riippumatta Array[String] Array[String] String String String String CS-A CS-A CS-A4 CS-A4 String String String String CS-A CS-A CS-A4 CS-A4 Rakenteellisten olioiden vertailu voi olla ei-vakioaikaista Tehokkuusmittareita järjestämisalgoritmeille: kokonaisajoaika, taulukon luku/kirjoitusoperaatioiden määrä, vaihtojen määrä, vertailujen määrä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 5 / 6

6 Rakenteellisia olioita voidaan järjestää myös tietyn kentän/alirakenteen eli avaimen (engl. key) mukaan Esimerkiksi alla työntekijät on järjestetty iän mukaan huomaa, että kaksi erillistä oliota voivat olla avaimen osalta yhtä suuria Array[Employee] Employee Employee Employee Employee name age salary name age salary name age salary name age salary String String String String St. Artup J. Smith P. Space B. Tree Tarkastellaan jatkossa selkeyden vuoksi yleensä vain kokonaislukutaulukkoja yleistäminen rakenteellisille olioille ja avaimille melko suoraviivaista Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 6 / 6

7 Paikallaan järjestäminen Määritelmä Järjestämisalgoritmi toimii paikallaan (engl. in place) jos sen ajon aikana kunakin ajanhetkenä vain jokin vakiomäärä alkioita on talletettu järjestettävän taulukon ulkopuolelle. Täten paikallaan järjestävät algoritmit eivät tarvitse suurta määrää ylimääräistä muistia tämä voi olla tärkeää kun järjestetään suuria datamääriä tai kun käytössä on vain suhteellisen pieni määrä muistia (sulautetut järjestelmät jne) Monet järjestämisalgoritmit, jotka eivät toimi paikallaan, käyttävät tyypillisesti aputaulukkoa, jonka koko on Θ(n), missä n on järjestettävän taulukon koko Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 7 / 6

8 Yllä oleva määritelmä on suhteellisen salliva eli se sallii esimerkiksi lineaarisen määrän indeksejä käytettävän rekursiivisessa kutsupinossa myös tiukempia versioita määrittelystä löytyy, ks. esimerkiksi tältä wikipedia-sivulta Yleisemmin voidaan puhua algoritmin vaatimasta työmuistin (tai lisämuistin) määrästä, eli siitä määrästä muistia, jonka algoritmi tarvitsee syötteen lisäksi. Tällä kierroksella oletetaan, että syötteen päälle pystyy kirjoittamaan, eli että tuloksena syntyvälle järjestetylle taulukolle ei välttämättä tarvitse varata uutta taulukkoa muistista Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 8 / 6

9 Vakaus (t. stabiilius) Määritelmä Järjestämisalgoritmi on vakaa (tai stabiili) (engl. stable) jos se pitää yhtäsuurten alkioiden keskinäisen järjestyksen ennallaan Scalan..8 metodit sorted ja sortwith toteuttavat stabiilin järjestämisalgoritmin. Myös sorted metodilla toteutettu sortby on stabiili. Esimerkiksi parit val l = L i s t ( ( c, ), ( b, ), ( e, ), ( a, ), ( b, ), ( a, ) ) voidaan järjestää sanakirjajärjestykseen (ensimmäinen kenttä merkitsevämpi) järjestämällä ensin toisen kentän mukaan scala> val tmp = l. sortby (. ) tmp = L i s t ( ( c, ), ( e, ), ( b, ), ( a, ), ( b, ), ( a, ) ) ja sitten (stabiililla algoritmilla) ensimmäisen mukaan scala> val r e s u l t = tmp. sortby (. ) r e s u l t = L i s t ( ( a, ), ( a, ), ( b, ), ( b, ), ( c, ), ( e, ) ) koska stabiili algoritmi ei vaihda esimerkiksi alkioiden (a,) ja (a,) keskinäistä järjestystä vaikka niiden ensimmäiset kentät ovat samat Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

10 C++-kielen (C++) algorithm-kirjasto sisältää eri funktiot stabiiliin järjestämiseen (stable sort-funktio) ja ei-välttämättä-stabiiliin järjestämiseen (sort-funktio) Jälkimmäisellä on hieman pienempi asymptoottinen pahimman tapauksen aikavaativuus silloin kun saatavilla ei ole tarpeeksi muistia aputaulukon varaamiseksi Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

11 Lisäysjärjestäminen Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

12 Erittäin yksinkertainen järjestämisalgoritmi, (engl. insertion sort) Tehokas vain hyvin pienille taulukoille Idea: Esimerkki Oletetaan, että taulukon i ensimmäistä alkiota ovat jo järjestyksessä; ensimmäisellä kierroksella i = Otetaan alkio i + ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j +,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Taulukko alussa a = [a,a,a,a ] a Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

13 Erittäin yksinkertainen järjestämisalgoritmi, (engl. insertion sort) Tehokas vain hyvin pienille taulukoille Idea: Oletetaan, että taulukon i ensimmäistä alkiota ovat jo järjestyksessä; ensimmäisellä kierroksella i = Otetaan alkio i + ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j +,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Esimerkki Ensimmäisen kierroksen alussa osataulukko [a ], sinisellä, on järjestyksessä Siirretään seuraavaa alkiota 7 vasemmalle kunnes se on oikeassa kohdassa Tässä siis siirretään kohtaan koska > 7 ja 7 kohtaan a Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

14 Erittäin yksinkertainen järjestämisalgoritmi, (engl. insertion sort) Tehokas vain hyvin pienille taulukoille Idea: Esimerkki Oletetaan, että taulukon i ensimmäistä alkiota ovat jo järjestyksessä; ensimmäisellä kierroksella i = Otetaan alkio i + ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j +,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Toiden kierroksen alussa osataulukko [a,a ] on järjestyksessä Siirretään alkiota 5 vasemmalle kunnes se on oikeassa kohdassa Eli ei tehdä mitään koska 5 a Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

15 Erittäin yksinkertainen järjestämisalgoritmi, (engl. insertion sort) Tehokas vain hyvin pienille taulukoille Idea: Esimerkki Oletetaan, että taulukon i ensimmäistä alkiota ovat jo järjestyksessä; ensimmäisellä kierroksella i = Otetaan alkio i + ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j +,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Nyt osataulukko [a,a,a ] on järjestyksessä Siirretään 8 vasemmalle kunnes se on oikeassa kohdassa Eli siirretään 5 kohtaan koska 5 > 8, kohtaan koska > 8 ja 8 kohtaan a Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

16 Erittäin yksinkertainen järjestämisalgoritmi, (engl. insertion sort) Tehokas vain hyvin pienille taulukoille Idea: Esimerkki Oletetaan, että taulukon i ensimmäistä alkiota ovat jo järjestyksessä; ensimmäisellä kierroksella i = Otetaan alkio i + ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j +,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Koko taulukko on nyt järjestyksessä a Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

17 Pseudokoodina: Insertion-sort(A): for i until A.length: e A[i] // element to be moved j i while j > and A[j ] > e: A[j] A[j ] j j A[j] e Huom: toisin kuin kirjassa Introduction to Algorithms, rd ed. (online via Aalto lib), tässä taulukon indeksointi on alkaa indeksistä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

18 Toteutus kokonaislukutaulukoille Scala-kielellä: def i n s e r t i o n S o r t ( a : Array [ I n t ] ) : Unit = { var i = while ( i < a. length ) { val key = a ( i ) var j = i ; while ( j > && a ( j ) > key ) { a ( j ) = a ( j ) j = } a ( j ) = key i += } } Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6

19 Algoritmin ominaisuuksia: Toimii paikallaan koska vain kulloinkin siirrettävä ja oikealle siirtyvä alkio on talletettu taulukon ulkopuoliseen muistiin Stabiili koska siirrettävä alkio siirretään aina viimeisimpään mahdolliseen kohtaan eli se ei hyppää samanarvoisten alkioiden ohi Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 5 / 6

20 Analyysiä Parhaan tapauksen ajoaika on Θ(n): taulukoilla, jotka ovat jo järjestyksessä, yhtään alkiota ei siirretä ja n alkion kohdalla tehdään yksi vertailu edeltävän alkion kanssa Pahimman tapauksen ajoaika on Θ(n ): Tarkastellaan taulukkoa, joka on alussa käänteisessä järjestyksessä toista alkiota siirretään askel kolmatta alkiota askelta... n:ttä alkiota siirretään n askelta Jokainen i askeleen siirto aiheuttaa i:n muun alkion siirtämisen oikealle kierros i suorittaa Θ(i) vertailua ja taulukon luku/kirjoitusoperaatiota T (n) = Θ(n) + T (n ) = Θ(n ) Samat parhaan ja pahimman tapauksen rajat koskevat myös tehtyjen vertailujen ja muistioperaatioiden määrää Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 6 / 6

21 Entäpä keskimääräinen ajoaika? Tarkastellaan taulukkoa, jossa n erisuurta satunnaisesti valittua alkiota Jokaisella kierroksella i, siirrettäessä alkiota a i oikealle paikalleen, osataulukko [a,...,a i ] sisältää keskimäärin i/ alkiota, jotka ovat pienempiä kuin a i keskimääräinen ajoaika on n i= i/ = Θ(n ) Näissä analyyseissa on siis oletettu, että kahden alkion vertailu sekä alkion luku taulukosta ja kirjoitus taulukkoon ovat vakioaikaisia operaatioita Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 7 / 6

22 Entäpä suorituskyky jossain sovelluksessa? Riippuu sovelluksen tuottamista syötetaulukoista Jos syötetaulukko on aina melkein järjestetty, lisäysjärjestäminen saatta toimia hyvinkin käytännössä Jos syötetaulukot ovat satunnaisesti järjestettyjä tai sellaisia, joissa monia alkioita täytyy siirtää pitkiä matkoja, kannattaa varmaan käyttää jotain muuta algoritmia Huom: lisäysjärjestämisalgoritmin koodi on hyvin kompakti eli siinä olevat vakiot ovat pieniä ja lisäksi peräkkäiset muistiviittaukset viittaavat yleensä lähellä olevaan kohtaan taulukossa lisäysjärjestäminen voi olla kilpailukykyinen (hyvin) pienille taulukoille Eräs mahdollinen optimointi: jos alkioiden vertailu onkin aikaavievempää, voitaisiin käyttää puolitushakua oikean siirtokohdan löytämiseksi Vertailujen lukumäärä pahimmassakin tapauksessa tippuu O(n log n) Mutta kokonaisajoaika säilyy Θ(n ) koska siirrot oikealle täytyy edelleen tehdä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 8 / 6

23 Yleiset tyypit Geneerinen versio lisäysjärjestämisestä mielivaltaisille vertailtaville alkiotyypeille: def i n s e r t i o n S o r t [ A <% Ordered [ A ] ] ( a : Array [ A ] ) = { var i = while ( i < a. length ) { val key = a ( i ) var j = i ; while ( j > && a ( j ) > key ) { a ( j ) = a ( j ) j = } a ( j ) = key i += } } Valitettavasti nykyisellä Scala-kääntäjällä yllä olevan yleistetyn koodin ajoaika on huomattavasti huonompi (ks seuraava kalvo) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

24 Lisäysjärjestäminen taulukoille, joissa satunnaisia kokonaislukuja Jotta voidaan käyttää Ordered-piirteen vertailuoperaatiota, jokainen taulukosta haettu kokonaisluku muutetaan olioksi ( boxing ), mikä aiheuttaa muistin varaamista ja myöhemmin vastaavasti roskankeruualgoritmin ajon Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

25 Lomitusjärjestäminen Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

26 Lomitusjärjestäminen on yksi käytetyimmistä järjestämisalgoritmeista Pahimman tapauksen ajoaika on O(n log n) Idea: Kahden jo järjestetyn taulukun yhdistäminen eli lomittaminen yhdeksi kummankin alkiot sisältäväksi järjestetyksi taulukoksi on helppoa Niinpä voidaan rekursiivisesti jakaa syötetaulukko pienemmiksi peräkkäisiksi osataulukoiksi kunnes ne on helppoa/triviaalia järjestää (esim. kunnes osataulukkossa on vain yksi alkio) ja sitten lomittaa saadut järjestetyt osataulukot pidemmiksi ja pidemmiksi kunnes koko taulukko on järjestetty Lomitusjärjestäminen on täten hajauta ja hallitse-tyyppinen algoritmi. Niissä on yleensä vaihetta: hajoita (engl. divide): ongelma hajoitetaan rekursiivisesti pienempiin osaongelmiin kunnes niistä tulee helppoja hallitse (engl. conquer): pienet osaongelmat ratkaistaan yhdistä (engl. combine): osaongelmien ratkaisut yhdistetään niin, että saadaan ratkaisu koko alkuperäiseen ongelmaan Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

27 Esimerkki Pienehkön taulukon järjestäminen lomitusjärjestämisellä, idea korkealla tasolla: original divide divide divide divide divide divide divide merge merge merge merge merge merge merge sorted Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

28 Lomitusoperaation toteuttaminen Hajoita-vaihe hajoittaa taulukon pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät osataulukkoa ovat myös peräkkäisiä Yhdistetty osataulukko muodostetaan yleensä ylimääräiseen aputaulukkoon ja kopioidaan sieltä sitten takaisin alkuperäiseen Lomitusalgoritmi pitää yllä kahta indeksiä, i ja j, yhdistettävien osataulukkojen alusta alkaen ja jokaisella askeleella kopioi näiden viittaamista alkioista pienemmän aputaulukkoon ja lisää kyseistä indeksiä yhdellä Esimerkki: Kahden peräkkäisen järjestetyn osataulukon yhdistäminen Oletetaan, että ollaan jo järjestetty peräkkäiset osataulukot [start,mid-]=[,] ja [mid,end]=[,] original aux start mid end Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6 i dest j

29 Lomitusoperaation toteuttaminen Hajoita-vaihe hajoittaa taulukon pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät osataulukkoa ovat myös peräkkäisiä Yhdistetty osataulukko muodostetaan yleensä ylimääräiseen aputaulukkoon ja kopioidaan sieltä sitten takaisin alkuperäiseen Lomitusalgoritmi pitää yllä kahta indeksiä, i ja j, yhdistettävien osataulukkojen alusta alkaen ja jokaisella askeleella kopioi näiden viittaamista alkioista pienemmän aputaulukkoon ja lisää kyseistä indeksiä yhdellä Esimerkki: Kahden peräkkäisen järjestetyn osataulukon yhdistäminen Verrataan alkioita 7 ja Alkio kopioidaan aputaulukkoon original aux start mid end Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6 i dest j

30 Lomitusoperaation toteuttaminen Hajoita-vaihe hajoittaa taulukon pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät osataulukkoa ovat myös peräkkäisiä Yhdistetty osataulukko muodostetaan yleensä ylimääräiseen aputaulukkoon ja kopioidaan sieltä sitten takaisin alkuperäiseen Lomitusalgoritmi pitää yllä kahta indeksiä, i ja j, yhdistettävien osataulukkojen alusta alkaen ja jokaisella askeleella kopioi näiden viittaamista alkioista pienemmän aputaulukkoon ja lisää kyseistä indeksiä yhdellä Esimerkki: Kahden peräkkäisen järjestetyn osataulukon yhdistäminen Verrataan alkioita 7 ja 9 Alkio 7 kopioidaan aputaulukkoon original start mid end i j aux Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6 dest

31 Lomitusoperaation toteuttaminen Hajoita-vaihe hajoittaa taulukon pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät osataulukkoa ovat myös peräkkäisiä Yhdistetty osataulukko muodostetaan yleensä ylimääräiseen aputaulukkoon ja kopioidaan sieltä sitten takaisin alkuperäiseen Lomitusalgoritmi pitää yllä kahta indeksiä, i ja j, yhdistettävien osataulukkojen alusta alkaen ja jokaisella askeleella kopioi näiden viittaamista alkioista pienemmän aputaulukkoon ja lisää kyseistä indeksiä yhdellä Esimerkki: Kahden peräkkäisen järjestetyn osataulukon yhdistäminen Verrataan alkioita ja 9 Alkio 9 kopioidaan aputaulukkoon original start mid end i j aux 7 Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6 dest

32 Lomitusoperaation toteuttaminen Hajoita-vaihe hajoittaa taulukon pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät osataulukkoa ovat myös peräkkäisiä Yhdistetty osataulukko muodostetaan yleensä ylimääräiseen aputaulukkoon ja kopioidaan sieltä sitten takaisin alkuperäiseen Lomitusalgoritmi pitää yllä kahta indeksiä, i ja j, yhdistettävien osataulukkojen alusta alkaen ja jokaisella askeleella kopioi näiden viittaamista alkioista pienemmän aputaulukkoon ja lisää kyseistä indeksiä yhdellä Esimerkki: Kahden peräkkäisen järjestetyn osataulukon yhdistäminen Oikean osataulukon indeksi j on nyt osataulukon ulkopuolella Kopioidaan vasemman osataulukon loput alkiot aputaulukkoon original aux start mid end i 7 9 Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6 dest j

33 Lomitusoperaation toteuttaminen Hajoita-vaihe hajoittaa taulukon pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät osataulukkoa ovat myös peräkkäisiä Yhdistetty osataulukko muodostetaan yleensä ylimääräiseen aputaulukkoon ja kopioidaan sieltä sitten takaisin alkuperäiseen Lomitusalgoritmi pitää yllä kahta indeksiä, i ja j, yhdistettävien osataulukkojen alusta alkaen ja jokaisella askeleella kopioi näiden viittaamista alkioista pienemmän aputaulukkoon ja lisää kyseistä indeksiä yhdellä Esimerkki: Kahden peräkkäisen järjestetyn osataulukon yhdistäminen Lopuksi järjestetty osataulukko kopioidaan aputaulukosta takaisin alkuperäiseen original aux start mid end Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6

34 Lomitusalgoritmin toteutus Scala-kielellä: def merge ( a : Array [ I n t ], aux : Array [ I n t ], s t a r t : I n t, mid : I n t, end : I n t ) : Unit = { var ( i, j, dest ) = ( s t a r t, mid, s t a r t ) while ( i < mid && j <= end ) { / / Merge to aux, s m a l l e st f i r s t i f ( a ( i ) <= a ( j ) ) { aux ( dest ) = a ( i ) ; i += } else { aux ( dest ) = a ( j ) ; j += } dest += } while ( i < mid ) { aux ( dest ) = a ( i ) ; i += ; dest += } / / Copy r e s t while ( j <= end ) { aux ( dest ) = a ( j ) ; j += ; dest += } / / Copy r e s t dest = s t a r t / / Copy from aux back to a while ( dest <= end ) { a ( dest ) = aux ( dest ) ; dest += } } Algoritmin ajoaika on selvästikin Θ(k), missä k on kahden yhdistettävän osataulukon yhteenlaskettu koko Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 5 / 6

35 Lomitusoperaatiota alifunktiona käyttäen itse rekursiivinen lomitusjärjestämisalgoritmi on varsin yksinkertainen ja elegantti: def mergesort ( a : Array [ I n t ] ) : Unit = { i f ( a. length <= ) return / / A u x i l i a r y memory f o r doing merges val aux = new Array [ I n t ] ( a. length ) / / The r e c u r s i v e main a l g o r i t h m def mergesort ( s t a r t : I n t, end : I n t ) : Unit = { i f ( s t a r t >= end ) return / / One or zero elements, do nothing val l e f t E n d = s t a r t + ( end s t a r t ) / / / The midpoint mergesort ( s t a r t, l e f t E n d ) / / Sort the l e f t h a l f mergesort ( l e f t E n d +, end ) / / Sort the r i g h t h a l f merge ( a, aux, s t a r t, l e f t E n d +, end ) / / Merge the r e s u l t s } mergesort (, a. length ) } Algoritmi yllä jälleen kokonaislukutaulukoille, yleistäminen muille ja yleisille Ordered-piirteen toteuttaville tyypeille helppoa Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 6 / 6

36 Ajoaika-analyysiä Lomitusjärjestämisen ajoaika saadaan rekursioyhtälöstä T (n) = T ( n/ ) + T ( n/ ) + cn missä c on jälleen vakio Jos n on kahden potenssi, voidaan tehdä sijoitus n = k ja saadaan T ( k ) = T ( k ) + T ( k ) + c k = c k + T ( k ) Laajentamalla rekursiyhtälöä saadaan T ( k ) = c k + (c k + T ( k )) = c k + c k + 4(c k + T ( k )) =... = kc k Koska k = log n, T (n) = cn log n = Θ(n log n) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 7 / 6

37 Ajoaikaa voidaan visualisoida myös graafisesti seuraavasti esittämällä arvon T (n) laskenta puuna: Total time at level T (n) cn nc log n levels T (n/) c n T (n/) c n T (n/4) c n 4 T (n/4) c n 4 T (n/4) c n 4 T (n/4) c n 4 nc nc T () c T () c T () c T () c T () c T () c T () c T () c nc Total in all levels: nc log n Tässä on abstrahoitu pois pyöristämiset ja käytetty rekursioyhtälöä T () = c ja T (n) = T (n/) + T (n/) + cn Punaiset tekstit kuvaavat solmussa ja tasolla kokonaisuudessaan tehtävää työmäärää Rekursio pysähtyy kun n eli kun i log i n; täten puussa on log n tasoa Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 8 / 6

38 Kokeellista analyysiä Suuremmille taulukoille lomitusjärjestäminen on huomattavasti nopeampi ja paremmin skaalautuva kuin lisäysjärjestäminen Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

39 Satunnaisia kokonaislukuja sisältävillä taulukoilla lisäysjärjestäminen on kilpailukykyinen ainoastaan erittäin pienillä taulukoilla Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

40 Pienten osataulukoiden käsitteleminen Jokainen rekursiokutsu aiheuttaa funktion kutsumisen... ja täten ylimääräisen koodin ajamista ja muistinvarausta (kutsukehyksen varaaminen ja alustus) Käytetään edellisessä vertailussa huomattua lisäysjärjestyksen suhteellista nopeutta pienillä taulukoilla hyväksi ja tehdään lomitusjärjestysalgoritmin pieni muunnos, joka ei tee rekursiota yhden kokoisiin taulukoihin asti vaan kutsuu lisäysjärjestysalgoritmia osataulukoille, jotka ovat jotain tiettyä alarajaa pienempiä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

41 Muunnos Scala-kielellä: def mergesort ( a : Array [ I n t ], t h r e s h o l d : I n t = 64) : Unit = { i f ( a. length <= ) return val aux = new Array [ I n t ] ( a. length ) def mergesort ( s t a r t : I n t, end : I n t ) : Unit = { i f ( end s t a r t < t h r e s h o l d ) i n s e r t i o n s o r t ( a, s t a r t, end ) / / Changed else { val l e f t E n d = ( s t a r t + end ) / mergesort ( s t a r t, l e f t E n d ) mergesort ( leftend +, end ) merge ( a, aux, s t a r t, l e f t E n d +, end ) } } mergesort (, a. length ) } Yllä insertionsort(a, start, end) järjestää osataulukon a[start, end] lisäysjärjestysalgoritmilla Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

42 Tuloksena kohtuullinen vakiokertoiminen parannus ajoaikaan Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 / 6

43 Pikajärjestäminen Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6

44 Toinen erittäin yleisesti käytetty järjestämismenetelmä (engl. quicksort) Kuten lomitusjärjestäminen, pikajärjestäminen on hajoita ja hallitse-tyyppinen algoritmi Helppo saada toimimaan paikallaan Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 5 / 6

45 Idea osataulukon A[lo, hi], missä lo hi, järjestämiseksi: Perustapaus: jos lo = hi, osataulukossa A[lo, hi] on vain yksi alkio ja se on täten järjestetty Hajoita: valitaan jokin jakoalkio (engl. pivot element) p osataulukosta A[lo, hi] ja ositetaan A[lo, hi] kolmeen osataulukkoon A[lo, q ], A[q, q] ja A[q +,hi] siten, että kaikki A[lo,q ] alkiot ovat pienempiä tai yhtä suuria kuin p, A[q,q] = [p] ja kaikki A[q +,hi] alkiot ovat yhtä suuria tai suurempia kuin p Tämän askeleen jälkeen p on oikealla paikallaan Hallitse: järjestetään osataulukot A[lo, q ] ja A[q +, hi] rekursiivisesti samalla lailla Pääfunktio Scala-kielellä: def q u i c k s o r t ( a : Array [ I n t ] ) : Unit = { def q u i c k s o r t ( l o : I n t, h i : I n t ) : Unit = { val q = p a r t i t i o n ( a, lo, h i ) i f ( l o < q ) q u i c k s o r t ( lo, q ) i f ( q + < h i ) q u i c k s o r t ( q +, h i ) } i f ( a. length >= ) q u i c k s o r t (, a. length ) } Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 6 / 6

46 Esimerkki: taulukon järjestäminen pikajärjestämisellä Edellisen kalvon Scala-toteutus Rekursiiviset kutsut ja ositusten tulokset suoritusjärjestyksessä Vihreä: osataulukko A[lo, hi] Punainen: jakoalkio Sininen: vasen osataulukko osituksen jälkeen Syaani: oikea osataulukko osituksen jälkeen quicksort(,7) after partition(,7) quicksort(,4) after partition(,4) quicksort(,4) after partition(,4) quicksort(,) after partition(,) quicksort(6,7) after partition(6,7) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 7 / 6

47 Sama puumuodossa esitettynä; toisin kuin lomitusjärjestämisessä, kutsupuu ei ole kovinkaan tasapainoinen input partition(,7) quicksort(,4) quicksort(6,7) partition(,4) partition(6,7) quicksort(,4) partition(,4) quicksort(,) 7 7 partition(,) 7 7 sorted Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 8 / 6

48 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, rd ed. (online via Aalto lib): Syötteenä osataulukko A[lo, hi] Valitaan jokin jakoalkio p osataulukosta Vaihdetaan jakoalkio osataulukon viimeisen alkion kanssa Alkaen indeksistä lo, käytetään indeksimuuttujia i ja j s.e. osataulukon alkiot i:n vasemmalla puolella ovat korkeintaan p alkiot i,...,j ovat suurempia kuin p Siirretään indeksiä j oikealle ja jos siinä oleva alkio on korkeintaan p, vaihdetaan alkiot kohdissa i ja j sekä lisätään indeksiä i yhdellä Lopuksi vaihdetaan viimeinen alkio (jakoalkio) ja alkio kohdassa i Esimerkki Aloitustilanne Jakoalkio p (punaisella) on osataulukon lopussa lo hi i j >, lisätään j yhdellä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

49 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, rd ed. (online via Aalto lib): Syötteenä osataulukko A[lo, hi] Valitaan jokin jakoalkio p osataulukosta Vaihdetaan jakoalkio osataulukon viimeisen alkion kanssa Alkaen indeksistä lo, käytetään indeksimuuttujia i ja j s.e. osataulukon alkiot i:n vasemmalla puolella ovat korkeintaan p alkiot i,...,j ovat suurempia kuin p Siirretään indeksiä j oikealle ja jos siinä oleva alkio on korkeintaan p, vaihdetaan alkiot kohdissa i ja j sekä lisätään indeksiä i yhdellä Lopuksi vaihdetaan viimeinen alkio (jakoalkio) ja alkio kohdassa i Esimerkki Syaanit alkiot kohdissa i,...,j ovat suurempia kuin jakoalkio 7, vaihdetaan alkiot kohdissa i ja j lo hi i j Lisätään i ja j yhdellä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

50 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, rd ed. (online via Aalto lib): Syötteenä osataulukko A[lo, hi] Valitaan jokin jakoalkio p osataulukosta Vaihdetaan jakoalkio osataulukon viimeisen alkion kanssa Alkaen indeksistä lo, käytetään indeksimuuttujia i ja j s.e. osataulukon alkiot i:n vasemmalla puolella ovat korkeintaan p alkiot i,...,j ovat suurempia kuin p Siirretään indeksiä j oikealle ja jos siinä oleva alkio on korkeintaan p, vaihdetaan alkiot kohdissa i ja j sekä lisätään indeksiä i yhdellä Lopuksi vaihdetaan viimeinen alkio (jakoalkio) ja alkio kohdassa i Esimerkki Siniset alkiot kohdissa lo,...,i ovat korkeintaan yhtä suuria kuin p 9, vaihdetaan alkiot kohdissa i ja j lo hi i j Lisätään i ja j yhdellä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

51 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, rd ed. (online via Aalto lib): Syötteenä osataulukko A[lo, hi] Valitaan jokin jakoalkio p osataulukosta Vaihdetaan jakoalkio osataulukon viimeisen alkion kanssa Alkaen indeksistä lo, käytetään indeksimuuttujia i ja j s.e. osataulukon alkiot i:n vasemmalla puolella ovat korkeintaan p alkiot i,...,j ovat suurempia kuin p Siirretään indeksiä j oikealle ja jos siinä oleva alkio on korkeintaan p, vaihdetaan alkiot kohdissa i ja j sekä lisätään indeksiä i yhdellä Lopuksi vaihdetaan viimeinen alkio (jakoalkio) ja alkio kohdassa i Esimerkki Siniset alkiot kohdissa lo,...,i ovat korkeintaan yhtä suuria kuin p, vaihdetaan alkiot kohdissa i ja j lo hi i j Lisätään i ja j yhdellä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

52 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, rd ed. (online via Aalto lib): Syötteenä osataulukko A[lo, hi] Valitaan jokin jakoalkio p osataulukosta Vaihdetaan jakoalkio osataulukon viimeisen alkion kanssa Alkaen indeksistä lo, käytetään indeksimuuttujia i ja j s.e. osataulukon alkiot i:n vasemmalla puolella ovat korkeintaan p alkiot i,...,j ovat suurempia kuin p Siirretään indeksiä j oikealle ja jos siinä oleva alkio on korkeintaan p, vaihdetaan alkiot kohdissa i ja j sekä lisätään indeksiä i yhdellä Lopuksi vaihdetaan viimeinen alkio (jakoalkio) ja alkio kohdassa i Esimerkki Jatketaan kunnes j = r Siniset alkiot kohdissa lo,...,i ovat korkeintaan yhtä suuria kuin p Syaanit alkiot kohdissa i,...,j ovat suurempia kuin jakoalkio lo i hi j Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

53 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, rd ed. (online via Aalto lib): Syötteenä osataulukko A[lo, hi] Valitaan jokin jakoalkio p osataulukosta Vaihdetaan jakoalkio osataulukon viimeisen alkion kanssa Alkaen indeksistä lo, käytetään indeksimuuttujia i ja j s.e. osataulukon alkiot i:n vasemmalla puolella ovat korkeintaan p alkiot i,...,j ovat suurempia kuin p Siirretään indeksiä j oikealle ja jos siinä oleva alkio on korkeintaan p, vaihdetaan alkiot kohdissa i ja j sekä lisätään indeksiä i yhdellä Lopuksi vaihdetaan viimeinen alkio (jakoalkio) ja alkio kohdassa i Esimerkki Vaihdetaan viimeinen alkio (jakoalkio) ja alkio kohdassa i Lopetetaan lo i hi j Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 9 / 6

54 Toteutus Scala-kielellä: def swap ( a : Array [ I n t ], i : I n t, j : I n t ) : Unit = { val t = a ( i ) ; a ( i ) = a ( j ) ; a ( j ) = t } def p a r t i t i o n ( a : Array [ I n t ], l o : I n t, h i : I n t ) : I n t = { val p i v o t = a ( h i ) / / Very simple p i v o t s e l e c t i o n! var i = l o var j = l o while ( j < h i ) { i f ( a ( j ) <= p i v o t ) { i += ; swap ( a, i, j ) } j += } swap ( a, i +, h i ) i + } Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6

55 Kokeellinen vertailu Lomitus- ja pikajärjestäminen taulukoilla, joissa satunnaisia kokonaislukuja: Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6

56 Lisäksi vielä Scala-standardikirjaston Array[Int].sorted ja java.util.arrays.sort Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6

57 Tässä käytetty funktion java.util.arrays.sort toteutus on eräs pikajärjestämisalgoritmin versio (ks. erään Java-toteutuksen lähdekoodi) Tämänhetkinen toteutus Array[Int].sorted-metodissa muuntaa kokonaislukutaulukon taulukoksi olioita ja kutsuu java.util.arrays.sort-funktiota oliotaulukoille; tämä taas toteuttaa TimSort -algoritmin (ks. erään Java-toteutuksen lähdekoodi) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 4 / 6

58 Ajoaikavaativuus Edellisten kokeellisten tulosten perusteella pikajärjestämisen ajoaika on varmaankin O(n log n)? Esitetyllä perusversiolla asia ei kuitenkaan ole näin vaan pahimman tapauksen ajoaika on Θ(n ) Ositusfunktion ajoaika on Θ(k), missä k on tarkasteltavan osataulukon koko Perusversiossa (Scala-koodi) valittiin aina osataulukon viimeinen alkio jakoalkioksi Neliöllinen pahimman tapauksen ajoaika realisoituu kun taulukko on jo alunperin järjestyksessä Jakoalkio ei liiku mihinkään ja vasemmanpuoleinen k alkion osataulukko on sama kuin ennen ositusta Rekursioyhtälöllä saadaan T (n) = Θ(n) + T (n ) = Θ(n ) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 44 / 6

59 Jakoalkion valinta Neliöllinen ajoaika jo järjestetyillä taulukoilla ei ole hyvä asia: käytännössä datamme voi usein olla jo (melkein) järjestyksessä Täten jakoalkion valinta on tärkeä asia O(n log n) saadaan kun valitaan jakoalkio niin, että syntyvät vasen ja oikea osataulukko ovat mahdollisimman samankokoisia Eli jakoalkioksi kannattaisi valita osataulukon mediaani Periaatteessa mediaani voidaan laskea lineaarisessa ajassa (ks. luku 9. kirjassa Introduction to Algorithms, rd ed. (online via Aalto lib)) mutta tähän liittyvät vakiot ovat melko suuria Käytännöllisempi approksimaatio on ottaa jakoalkioksi osataulukon satunnaisesti valitun alkion mediaani Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 45 / 6

60 Toinen yleinen ja helppo strategia on valita jakoalkio satunnaisesti tarkasteltavasta osataulukosta Taulukoille, joissa on n erisuuruista alkiota, pikalajittelun odotettu ajoaika on O(n log n) kun valitaan satunnainen jakoalkio (kappale 7.4 kirjassa Introduction to Algorithms, rd ed. (online via Aalto lib)) Vastaavaa tapahtui kokeellisissa tuloksissa aiemmin: niissä ei valittu satunnaista jakoalkiota mutta alkiot olivat satunnaisia ja siksi tilanne oli käytännössä sama ja ajoaika skaalautui kuten O(n log n) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 46 / 6

61 Yhtäsuuret alkiot Toinen ongelma pikajärjestämisalgoritmin perusversiolle muodostuu yhtäsuurista alkioista Tarkastellaan taulukkoa, jossa on n alkiota ja kaikki alkiot ovat samoja Riippumatta jakoalkion valinnasta, k-alkioisen osataulukon ositus tuottaa jakoalkion sekä yhden uuden alitaulukon, jonka koko on k Tällöin kokonaisajoaika on taas Θ(n ) Tämä ongelma voidaan ratkaista paremmalla ositusalgoritmilla, joka tuottaa uutta osataulukkoa: ensimmäisen alkiot ovat pienempiä kuin jakoalkio, toisen, sisältäen jakoalkion, ovat yhtä suuria ja kolmannen ovat suurempia yhtäsuuria alkiota sisältävä osataulukko on nyt järjestetty eikä sitä tarvitse enää käsitellä jatkossa toteutus ohjelmointitehtävässä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 47 / 6

62 Asymptoottisia alarajoja Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 48 / 6

63 Kuinka kaukana optimaalisesta esimerkiksi lomitusjärjestäminen on? Jotta tähän voidaan vastata, täytyy määrittää käytetty laskennan malli Oletataan normaali random access machine -malli, missä muistiosoitteisiin voidaan viitata vakioajassa ja missä muistiosoitteisiin ja rekistereihin mahtuu tietty kiinteä määrä bittejä (, 64 tms) Yksittäinen laskennan askel voi käsitellä vain jotain vakiomäärää bittejä Oletetaan lisäksi vain vertailuja -rajoitus, missä kahta alkiota voidaan vertailla operaatioilla =, <,, > ja mutta alkioista ei voida käyttää muuta tietoa, kuten esimerkiksi niiden bittitason koodausta Esimerkiksi järjestämisalgoritmitoteutukset, jotka käyttävät alkioiden vertailuun vain Scala-kielen Ordered-piirrettä, kuuluvat tähän luokkaan Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 49 / 6

64 Tällaisessa vain vertailuja -mallissa voidaan todistaa asymptoottiset alarajat sille, kuinka monta vertailua mikä tahansa algoritmi joutuu pahimmassa tapauksessa suorittamaan Alkion hakeminen järjestetystä taulukosta vaatii Ω(log n) vertailua pahimmassa tapauksessa Täten puolitushakualgoritmi on, asymptoottisessa mielessä, optimaalinen n-alkioisen taulukon järjestäminen vaatii Ω(n log n) vertailua pahimassa tapauksessa Täten lomitusjärjestäminen on asymptoottisessa mielessä optimaalinen Todistukset: kappale 8. kirjassa Introduction to Algorithms, rd ed. (online via Aalto lib) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 5 / 6

65 Laskemis- ja kantalukujärjestäminen Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 5 / 6

66 Useille alkiotyypeille voidaan tehdä järjestämisalgoritmeja, jotka eivät pohjaudu alkioiden suoraan vertailuun Toisin sanoen voidaan käyttää alkioiden ominaisuuksia hyväksi ja saada aikaan nopeampia järjestämisalgoritmeja Seuraavassa tarkastellaan laskemisjärjestämistä (engl. counting sort), jota voidaan käyttää pienille kokonaisluvuille kuvautuville alkiojoukoille, sekä kantalukujärjestämistä, joka käyttää hyväkseen alkioiden binääri-, merkkijono-, tms esitystä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 5 / 6

67 Laskemisjärjestäminen Oletetaan, että esiintyvät alkiot ovat lukuja {,..., k } jollekin kohtuullisen pienelle arvolle k (tai helposti kuvattavissa tälle joukolle) Esimerkiksi jos tahdotaan järjestää taulukollinen tavuja, niin k = 56 Laskemisjärjestämisen ideana on ensin laskea jokaisen alkion esiintymismäärä taulukossa ja sitten käyttää esiintymismäärien kumulatiivista määrää siirrettäessä jokainen alkio yksi kerrallaan oikealle paikalle Käyttää lisämuistia määrän Θ(n + k) eli ei toimi paikallaan: Θ(k) tavua taulukolle, johon esiintymismäärät lasketaan Θ(n) tavua tulostaulukolle Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 5 / 6

68 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen counting-sort(a): // : Allocate and init arrays count int-array of length k result int-array of length A.length for v in until k: count[v] // : Count occurrences for i in until A.length: count[a[i]] += // : Cumulative occurrences cumu for v in until k: current count[v] count[v] cumu cumu += current // 4: Make the result for i in until A.length: result[count[a[i]]] A[i] count[a[i]] += 4 7 original count result 4 5 Kohta Varataan apu- ja tulostaulukot Alustetaan aputaulukko count arvoilla Vie ajan Θ(k) Tässä k = Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 54 / 6

69 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen counting-sort(a): // : Allocate and init arrays count int-array of length k result int-array of length A.length for v in until k: count[v] // : Count occurrences for i in until A.length: count[a[i]] += // : Cumulative occurrences cumu for v in until k: current count[v] count[v] cumu cumu += current // 4: Make the result for i in until A.length: result[count[a[i]]] A[i] count[a[i]] += Kohta original result count Lasketaan n askeleella jokaiseen alkioon count[j] kuinka monta kertaa alkio j esiintyy syötetaulukossa Vie ajan Θ(n) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 54 / 6

70 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen counting-sort(a): // : Allocate and init arrays count int-array of length k result int-array of length A.length for v in until k: count[v] // : Count occurrences for i in until A.length: count[a[i]] += // : Cumulative occurrences cumu for v in until k: current count[v] count[v] cumu cumu += current // 4: Make the result for i in until A.length: result[count[a[i]]] A[i] count[a[i]] += Kohta original result count index Jokaiselle arvolle j lasketaan luku index[j] = j l= count[l], joka kertoo ensimmäisen arvon j esiintymiskohdan järjestetyssä tulostaulukossa Huom: pseudokoodissa tämä lasketaan taulukkoon count tilan säästämiseksi Vie ajan Θ(k) Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 54 /

71 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen counting-sort(a): // : Allocate and init arrays count int-array of length k result int-array of length A.length for v in until k: count[v] // : Count occurrences for i in until A.length: count[a[i]] += // : Cumulative occurrences cumu for v in until k: current count[v] count[v] cumu cumu += current // 4: Make the result for i in until A.length: result[count[a[i]]] A[i] count[a[i]] += 4 7 original result count index Kohta 4, ensimmäinen iteraatio Kopioidaan alkio e syötetaulukon kohdasta tulostaulukon result kohtaan index[e ] Lisätään arvoa index[e ] yhdellä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 54 / 6

72 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen counting-sort(a): // : Allocate and init arrays count int-array of length k result int-array of length A.length for v in until k: count[v] // : Count occurrences for i in until A.length: count[a[i]] += // : Cumulative occurrences cumu for v in until k: current count[v] count[v] cumu cumu += current // 4: Make the result for i in until A.length: result[count[a[i]]] A[i] count[a[i]] += original 6 result Kohta 4, toinen iteraatio count index Kopioidaan alkio e syötetaulukon kohdasta tulostaulukon result kohtaan index[e ] Lisätään arvoa index[e ] yhdellä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 54 / 6

73 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen counting-sort(a): // : Allocate and init arrays count int-array of length k result int-array of length A.length for v in until k: count[v] // : Count occurrences for i in until A.length: count[a[i]] += // : Cumulative occurrences cumu for v in until k: current count[v] count[v] cumu cumu += current // 4: Make the result for i in until A.length: result[count[a[i]]] A[i] count[a[i]] += original 6 result Kohta 4, kolmas iteraatio count index Kopioidaan alkio e syötetaulukon kohdasta tulostaulukon result kohtaan index[e ] Lisätään arvoa index[e ] yhdellä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 54 / 6

74 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen counting-sort(a): // : Allocate and init arrays count int-array of length k result int-array of length A.length for v in until k: count[v] // : Count occurrences for i in until A.length: count[a[i]] += // : Cumulative occurrences cumu for v in until k: current count[v] count[v] cumu cumu += current // 4: Make the result for i in until A.length: result[count[a[i]]] A[i] count[a[i]] += 4 4 Kohta 4 original result count index Jatketaan, kunnes ollaan taulukon lopussa Kopioidaan tulostaulukko result takaisin alkuperäiseen jos tahdotaan Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 54 / 6

75 Laskemisjärjestämisen ominaisuuksia: Vakaa Tarvitsee lisämuistia määrän Θ(k + n) Toimii ajassa Θ(k + n) Erittäin hyvä algoritmi jos k on pieni ja n k Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 55 / 6

76 Eniten merkitsevä numero ensin -kantalukujärjestäminen (engl. most-significant-digit-first radix sorting, MSD radix sorting) Oletetaan, että järjestettävät alkiot ovat sekvenssejä numeroita (engl. digit) joukosta,..., k ja tahdotaan järjestää ne sanakirjajärjestykseen Esimerkiksi -bittiset kokonaisluvut ovat sekvenssejä, jotka koostuvat 4 kpl 8-bittisiä tavuja (numeroita välillä 55) ASCII-merkkijonot ovat sekvenssejä ASCII-merkkejä (numeroita välillä 7) Eniten merkitsevä numero ensin -kantalukujärjestäminen järjestää alkiot ensin ensimmäisen numeron mukaan käyttäen laskemisjärjestämistä ja sen jälkeen rekursiivisesti järjestää kunkin osataulukon, joka alkaa samalla numerolla, samalla tavalla mutta jättäen huomiotta eniten merkitsevän numeron Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 56 / 6

77 Ominaisuuksia: Vakaa Tarvitsee määrän Θ(k + n) lisämuistia Toimii ajassa O((k + n)d), missä d on tarkasteltavien alkioiden numeroesityksen maksimipituus Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 57 / 6

78 Vähiten merkitsevä numero ensin -kantalukujärjestäminen (engl. least-significant-digit-first radix sorting, LSD radix sorting) Oletetaan jälleen, että alkiot ovat sekvenssejä numeroita joukosta {,..., k } ja ne tahdotaan järjestää leksikograafiseen järjestykseen Nyt oletetaan lisäksi, että kaikki alkiot ovat saman mittaisia koostuen d numerosta Alkiot voisivat siis olla esimerkiksi -bittisiä kokonaislukuja, jotka koostuvat 4 kpl 8-bittisiä tavuja tai samanpituisia ASCII-merkkijonoja kuten vaikkapa suomalaisia sosiaaliturvatunnuksia Vähiten merkitsevä numero ensin -kantalukujärjestäminen järjestää ensin alkiot viimeisimmän (vähiten merkitsevä) numeron mukaan käyttäen vakaata laskemisjärjestämistä ja sen jälkeen iteratiivisesti järjestää alkiot samalla lailla vakaalla laskemisjärjestämisellä toiseksi vähiten merkitsevän numeron mukaan jne Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 58 / 6

79 Ominaisuuksia: Esimerkki vakaa tarvitsee lisätilaa määrän Θ(k + n) toimii ajassa O((k + n)d) 6-bittisten etumerkittömien lukujen järjestäminen vähiten merkitsevä numero ensin -kantalukujärjestämisellä 4-bittiä kerrallaan f a8 e f6 e a8 a8 f f f6 f f stable sort with the last digit as the key 4 e 5 6 stable sort with the second last digit as the key stable sort with the third last digit as the key a8 6 e stable sort with the fourth last digit as the key 4 fff fff 7 7 f6 7 f 7 e a8 8 f fff 9 fff 9 fff 9 4 Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 59 / 6

80 Toteutus ja kokeellinen tarkastelu Ohjelmointitehtävänä Tommi Junttila (Aalto University) Kierros CS-A4 / Autumn 7 6 / 6

CS-A1140 Tietorakenteet ja algoritmit

CS-A1140 Tietorakenteet ja algoritmit CS-A1140 Tietorakenteet ja algoritmit Kierros 2: Järjestämisalgoritmeja Tommi Junttila Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Syksy 2016 Materiaali Kirjassa Introduction to Algorithms,

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 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

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 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: 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

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

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

9 Erilaisia tapoja järjestää

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

Lisätiedot

TIE Tietorakenteet ja algoritmit 25

TIE Tietorakenteet ja algoritmit 25 TIE-20100 Tietorakenteet ja algoritmit 25 Tällä kurssilla keskitytään algoritmien ideoihin ja algoritmit esitetään useimmiten pseudokoodina ilman laillisuustarkistuksia, virheiden käsittelyä yms. Otetaan

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

Mukautuvat järjestämisalgoritmit

Mukautuvat järjestämisalgoritmit 1 Mukautuvat järjestämisalgoritmit Riku Saikkonen TIK-päivä, 17. 1. 2013 2 Mukautuva järjestäminen minkä tahansa vertailuihin perustuvan järjestämisalgoritmin täytyy tehdä pahimmassa tapauksessa vähintään

Lisätiedot

A TIETORAKENTEET JA ALGORITMIT

A TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT LISÄÄ JÄRJESTÄMISESTÄ JÄRJESTÄMISEN TEORIAA Inversio taulukossa a[] on lukupari (a[i],a[j]) siten, että i < j mutta a[i] > a[j] Esimerkki Taulukko a[] = [2, 4, 1, 3]

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 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

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

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen) 58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen) 1. Lisäysjärjestämisessä järjestetään ensin taulukon kaksi ensimmäistä lukua, sitten kolme ensimmäistä lukua, sitten neljä ensimmäistä

Lisätiedot

On annettu jono lukuja tai muita alkioita, joiden välille on määritelty suuruusjärjestys. Tehtävänä on saattaa alkiot suuruusjärjestykseen.

On annettu jono lukuja tai muita alkioita, joiden välille on määritelty suuruusjärjestys. Tehtävänä on saattaa alkiot suuruusjärjestykseen. 6. Järjestäminen On annettu jono lukuja tai muita alkioita, joiden välille on määritelty suuruusjärjestys. Tehtävänä on saattaa alkiot suuruusjärjestykseen. Tämä on eräs klassisimpia tietojenkäsittelyongelmia,

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

Tietorakenteet ja algoritmit. Järjestäminen. Ari Korhonen

Tietorakenteet ja algoritmit. Järjestäminen. Ari Korhonen Tietorakenteet ja algoritmit Järjestäminen Ari Korhonen 6.10.2015 1 6. Järjestäminen (sor0ng) 6.1 Johdanto 6.2 Yksinkertaiset menetelmät 6.2.1 Valintajärjestäminen 6.2.2 Lisäysjärjestäminen 6.3 Lomitusjärjestäminen

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

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

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 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

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

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

Olkoon S(n) kutsun merge-sort(a, p, q) tilavaativuus kun p q + 1 = n. Oletetaan merge toteutetuksi vakiotyötilassa (ei-triviaalia mutta mahdollista).

Olkoon S(n) kutsun merge-sort(a, p, q) tilavaativuus kun p q + 1 = n. Oletetaan merge toteutetuksi vakiotyötilassa (ei-triviaalia mutta mahdollista). Esimerkki Lomitusjärjestäminen merge-sort(a, p, q): var k % paikallinen muuttuja, vakiotila 1. if p < q then 2. r := (p + q)/2 3. merge-sort(a, p, r) 4. merge-sort(a, r + 1, q) 5. merge(a, p, r, q) Olkoon

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

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, 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

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

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Demot Timo Männikkö Algoritmit 2 Demot 1 27.-28.3.2019 Timo Männikkö Tehtävä 1 (a) 4n 2 + n + 4 = O(n 2 ) c, n 0 > 0 : 0 4n 2 + n + 4 cn 2 n n 0 Vasen aina tosi Oikea tosi, jos (c 4)n 2 n 4 0, joten oltava c > 4 Kokeillaan

Lisätiedot

Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin

Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin jaetaan muut alkiot kahteen ryhmään: L: alkiot, jotka eivät suurempia kuin pivot G : alkiot, jotka suurempia kuin pivot 6 1 4 3 7 2

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

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista 811312A Tietorakenteet ja algoritmit 2016-2017 III Lajittelualgoritmeista Sisältö 1. Johdanto 2. Pikalajittelu 3. Kekolajittelu 4. Lajittelualgoritmien suorituskyvyn rajoista 811312A TRA, Lajittelualgoritmeista

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

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

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

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 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

Tämä on helpompi ymmärtää, kun tulkitaan keko täydellisesti tasapainotetuksi binääripuuksi, jonka juuri on talletettu taulukon paikkaan

Tämä on helpompi ymmärtää, kun tulkitaan keko täydellisesti tasapainotetuksi binääripuuksi, jonka juuri on talletettu taulukon paikkaan TIE-20100 Tietorakenteet ja algoritmit 178 Keko Taulukko A[1... n] on keko, jos A[i] A[2i] ja A[i] A[2i + 1] aina kun 1 i n 2 (ja 2i + 1 n). Tämä on helpompi ymmärtää, kun tulkitaan keko täydellisesti

Lisätiedot

A TIETORAKENTEET JA ALGORITMIT

A TIETORAKENTEET JA ALGORITMIT A274105 TIETORAKENTEET JA ALGORITMIT HARJOITUSTEHTÄVÄT 6 DEADLINE 1.4.2009 KLO 9:00 Kynätehtävät tehdään kirjallisesti ja esitetään harjoituksissa. Välivaiheet näkyviin! Ohjelmointitehtävät sähköisesti

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

TAMPEREEN TEKNILLINEN YLIOPISTO

TAMPEREEN TEKNILLINEN YLIOPISTO TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 06.09.2005 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3 1. TEHTÄVÄ

Lisätiedot

TAMPEREEN TEKNILLINEN YLIOPISTO

TAMPEREEN TEKNILLINEN YLIOPISTO TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 11.08.2010 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3 1. TEHTÄVÄ

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

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

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

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

Algoritmit 2. Luento 12 To Timo Männikkö

Algoritmit 2. Luento 12 To Timo Männikkö Algoritmit 2 Luento 12 To 3.5.2018 Timo Männikkö Luento 12 Geneettiset algoritmit Simuloitu jäähdytys Merkkijonon sovitus Horspoolin algoritmi Algoritmit 2 Kevät 2018 Luento 12 To 3.5.2018 2/35 Algoritmien

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

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

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 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

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

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

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

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

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00 A274101 TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE 9.2.2005 KLO 12:00 PISTETILANNE: www.kyamk.fi/~atesa/tirak/harjoituspisteet-2005.pdf Kynätehtävät palautetaan kirjallisesti

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

Datatähti 2019 loppu

Datatähti 2019 loppu Datatähti 2019 loppu task type time limit memory limit A Summa standard 1.00 s 512 MB B Bittijono standard 1.00 s 512 MB C Auringonlasku standard 1.00 s 512 MB D Binääripuu standard 1.00 s 512 MB E Funktio

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

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero Alkioiden avaimet Usein tietoalkioille on mielekästä määrittää yksi tai useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero 80 op

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

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

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

Kierros 6: Dynaaminen ohjelmointi ja ahneet algoritmit

Kierros 6: Dynaaminen ohjelmointi ja ahneet algoritmit 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

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

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

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

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

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa Kekolajittelu Prioriteettijonolla toteutettu keko InsertItem ja RemoveMinElem: O(log(n)) Lajittelu prioriteettijonolla: PriorityQueueSort(lajiteltava sekvenssi S) alusta prioriteettijono P while S.IsEmpty()

Lisätiedot

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu 811312A Tietorakenteet ja algoritmit, 2018-2019, Harjoitus 3, Ratkaisu Harjoituksessa käsitellään algoritmien aikakompleksisuutta. Tehtävä 3.1 Kuvitteelliset algoritmit A ja B lajittelevat syötteenään

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

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö Algoritmit 1 Demot 1 31.1.-1.2.2018 Timo Männikkö Tehtävä 1 (a) Algoritmi, joka tutkii onko kokonaisluku tasan jaollinen jollain toisella kokonaisluvulla siten, että ei käytetä lainkaan jakolaskuja Jaettava

Lisätiedot

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö Algoritmit 1 Demot 2 1.-2.2.2017 Timo Männikkö Tehtävä 1 (a) Ei-rekursiivinen algoritmi: laskesumma(t, n) sum = t[0]; for (i = 1; i < n; i++) sum = sum + t[i]; return sum; Silmukka suoritetaan n 1 kertaa

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

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Taulukon edut Taulukon haitat Taulukon haittojen välttäminen Dynaamisesti linkattu lista Linkatun listan solmun määrittelytavat Lineaarisen listan toteutus dynaamisesti linkattuna

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

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

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.

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

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

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

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen) 58131 Tietorakenteet Erilliskoe 11.11.2008, ratkaisuja (Jyrki Kivinen) 1. (a) Koska halutaan DELETEMAX mahdollisimman nopeaksi, käytetään järjestettyä linkitettyä listaa, jossa suurin alkio on listan kärjessä.

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

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

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia 58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, 10..2014, vastauksia 1. [9 pistettä] (a) Todistetaan 2n 2 + n + 5 = O(n 2 ): Kun n 1 on 2n 2 + n + 5 2n 2 + n 2 +5n 2 = 8n 2. Eli

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia 58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, 652013, vastauksia 1 [6 pistettä] Vastaa jokaisesta alla olevasta väittämästä onko se tosi vai epätosi ja anna lyhyt perustelu Jokaisesta kohdasta

Lisätiedot

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A. Tehtävä. Tämä tehtävä on aineistotehtävä, jossa esitetään ensin tehtävän teoria. Sen jälkeen esitetään neljä kysymystä, joissa tätä teoriaa pitää soveltaa. Mitään aikaisempaa tehtävän aihepiirin tuntemusta

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT HAJAUTUS, JÄRJESTÄMISESTÄ HAJAUTTAMISEN IDEA Jos avaimet (tai data) ovat kokonaislukuja välillä 1 N, voidaan niitä käyttää suoraan indeksointiin Järkevä rakenne on

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

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

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016 ICS-C2000 Tietojenkäsittelyteoria Kevät 206 Kierros 0, 2. 24. maaliskuuta Huom! Perjantaina 25. maaliskuuta ei ole laskareita (pitkäperjantai), käykää vapaasti valitsemassanne ryhmässä aiemmin viikolla.

Lisätiedot

Ohjelmoinnin perusteet Y Python

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

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

Olio-ohjelmointi Syntaksikokoelma

Olio-ohjelmointi Syntaksikokoelma C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja

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

Rakenteiset tietotyypit Moniulotteiset taulukot

Rakenteiset tietotyypit Moniulotteiset taulukot C! Rakenteiset tietotyypit Moniulotteiset taulukot 22.2.2018 Agenda Rakenteiset tietotyypit Vilkaisu 6. kierroksen tehtäviin Moniulotteiset taulukot Esimerkki Seuraava luento to 8.3. Ilmoittautuminen ohjelmointikokeeseen

Lisätiedot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan

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