CS-A1140 Tietorakenteet ja algoritmit

Koko: px
Aloita esitys sivulta:

Download "CS-A1140 Tietorakenteet ja algoritmit"

Transkriptio

1 CS-A1140 Tietorakenteet ja algoritmit Kierros 2: Järjestämisalgoritmeja Tommi Junttila Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Syksy 2016

2 Materiaali Kirjassa Introduction to Algorithms, 3rd ed. (online via Aalto lib): Lisäysjärjestäminen: kappaleet 2.1 ja 2.2 Lomitusjärjestäminen: kappale 2.3 Pikajärjestäminen: luku 7 Asymptoottisia alarajoja: kappale 8.1 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 wikipediasivulle on koottu eri algoritmeja ja niiden välinen vertailu ajoajan, vaaditun työmuistin jne suhteen. 2/80

3 Osittain vastaavia tekstejä muualla: Luku 2 kirjassa Algorithms, 4th ed. OpenDSA Joitain netistä löytyviä videoluentoja ja visualisoiteja: MIT OCW video on insertion and merge sorts MIT OCW video on counting sort, radix sort and lower bounds for sorting and searching MIT OCW video on Quicksort, Randomized Algorithms MIT 6.046J 2015 OCW video on Randomized Select and Randomized Quicksort 15 Sorting Algorithms in 6 Minutes video visualizations of comparison based sorting algorithms 3/80

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 4/80

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-A1110 CS-A1120 CS-A1140 CS-A1141 String String String String CS-A1110 CS-A1120 CS-A1140 CS-A1141 Rakenteellisten olioiden vertailu voi olla ei-vakioaikaista Tehokkuusmittareita järjestämisalgoritmeille: kokonaisajoaika, taulukon luku/kirjoitusoperaatioiden määrä, vaihtojen määrä, vertailujen määrä 5/80

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 6/80

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

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 8/80

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 metodit sorted ja sortwith toteuttavat stabiilin järjestämisalgoritmin. Myös sorted metodilla toteutettu sortby on stabiili. Esimerkiksi parit v a l l = L i s t ( ( " c ", 2 ), ( " b ", 3 ), ( " e ", 2 ), ( " a ", 3 ), ( " b ", 2 ), ( " a ", 2 ) ) voidaan järjestää sanakirjajärjestykseen (ensimmäinen kenttä merkitsevämpi) järjestämällä ensin toisen kentän mukaan scala > v a l tmp = l. sortby ( _. _2 ) tmp = L i s t ( ( c, 2 ), ( e, 2 ), ( b, 2 ), ( a, 2 ), ( b, 3 ), ( a, 3 ) ) ja sitten (stabiililla algoritmilla) ensimmäisen mukaan scala > v a l r e s u l t = tmp. sortby ( _. _1 ) r e s u l t = L i s t ( ( a, 2 ), ( a, 3 ), ( b, 2 ), ( b, 3 ), ( c, 2 ), ( e, 2 ) ) koska stabiili algoritmi ei vaihda esimerkiksi alkioiden (a,3) ja (a,2) keskinäistä järjestystä vaikka niiden ensimmäiset kentät ovat samat 9/80

10 C++-kielen (C++11) 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 10/80

11 Lisäysjärjestäminen 11/80

12 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 = 1 Otetaan alkio i + 1 ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j + 1,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + 1 alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Esimerkki: Taulukko alussa a = [a 0,a 1,a 2,a 3 ] a /80

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 = 1 Otetaan alkio i + 1 ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j + 1,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + 1 alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Esimerkki: Ensimmäisen kierroksen alussa osataulukko [a 0 ], sinisellä, on järjestyksessä Siirretään seuraavaa alkiota 17 vasemmalle kunnes se on oikeassa kohdassa Tässä siis siirretään 23 kohtaan 1 koska 23 > 17 ja 17 kohtaan 0 a /80

14 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 = 1 Otetaan alkio i + 1 ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j + 1,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + 1 alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Esimerkki: Toiden kierroksen alussa osataulukko [a 0,a 1 ] on järjestyksessä Siirretään alkiota 25 vasemmalle kunnes se on oikeassa kohdassa Eli ei tehdä mitään koska a /80

15 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 = 1 Otetaan alkio i + 1 ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j + 1,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + 1 alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Esimerkki: Nyt osataulukko [a 0,a 1,a 2 ] on järjestyksessä Siirretään 18 vasemmalle kunnes se on oikeassa kohdassa Eli siirretään 25 kohtaan 3 koska 25 > 18, 23 kohtaan 2 koska 23 > 18 ja 18 kohtaan 1 a /80

16 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 = 1 Otetaan alkio i + 1 ja etsitään mihin kohtaan j se kuuluisi jo järjestetyssä taulukon alkuosassa Siirretään alkioita j + 1,..., i yksi askel oikealle Lisätään alkio kohtaan j Nyt ensimmäiset i + 1 alkiota ovat järjestyksessä Toistetaan, kunnes koko taulukko on järjestyksessä Esimerkki: Koko taulukko on nyt järjestyksessä a /80

17 Pseudokoodina: Insertion-sort(A): for i 1 until A.length: e A[i] // element to be moved j i while j > 0 and A[j 1] > e: A[j] A[j 1] j j 1 A[j] e Huom: toisin kuin kirjassa Introduction to Algorithms, 3rd ed. (online via Aalto lib), tässä taulukon indeksointi on alkaa indeksistä 0 17/80

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 = 1 while ( i < a. length ) { val key = a ( i ) var j = i ; while ( j > 0 && a ( j 1) > key ) { a ( j ) = a ( j 1) j = 1 } a ( j ) = key i += 1 } } 18/80

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 19/80

20 Analyysiä Parhaan tapauksen ajoaika on Θ(n): taulukoilla, jotka ovat jo järjestyksessä, yhtään alkiota ei siirretä ja n 1 alkion kohdalla tehdään yksi vertailu edeltävän alkion kanssa Pahimman tapauksen ajoaika on Θ(n 2 ): Tarkastellaan taulukkoa, joka on alussa käänteisessä järjestyksessä toista alkiota siirretään 1 askel kolmatta alkiota 2 askelta... n:ttä alkiota siirretään n 1 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 1) = Θ(n 2 ) Samat parhaan ja pahimman tapauksen rajat koskevat myös tehtyjen vertailujen ja muistioperaatioiden määrää 20/80

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 0,...,a i 1 ] sisältää keskimäärin i/2 alkiota, jotka ovat pienempiä kuin a i keskimääräinen ajoaika on n 1 i=1 i/2 = Θ(n2 ) Näissä analyyseissa on siis oletettu, että kahden alkion vertailu sekä alkion luku taulukosta ja kirjoitus taulukkoon ovat vakioaikaisia operaatioita 21/80

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(nlog 2 n) Mutta kokonaisajoaika säilyy Θ(n 2 ) koska siirrot oikealle täytyy edelleen tehdä 22/80

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 = 1 while ( i < a. length ) { val key = a ( i ) var j = i ; while ( j > 0 && a ( j 1) > key ) { a ( j ) = a ( j 1) j = 1 } a ( j ) = key i += 1 } } Valitettavasti nykyisellä Scala-kääntäjällä yllä olevan yleistetyn koodin ajoaika on huomattavasti huonompi (ks seuraava kalvo) 23/80

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 24/80

25 Lomitusjärjestäminen 25/80

26 Lomitusjärjestäminen on yksi käytetyimmistä järjestämisalgoritmeista Pahimman tapauksen ajoaika on O(nlog 2 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ä 3 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 26/80

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

28 Lomitusoperaation toteuttaminen Hajoita-vaiheessa taulukko hajoitetaan pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa mihinkään vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät 2 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-1]=[0,1] ja [mid,end]=[2,3] start mid end original i j aux dest 28/80

29 Lomitusoperaation toteuttaminen Hajoita-vaiheessa taulukko hajoitetaan pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa mihinkään vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät 2 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 17 ja 1 original start mid end Alkio 1 kopioidaan aputaulukkoon aux i dest j 29/80

30 Lomitusoperaation toteuttaminen Hajoita-vaiheessa taulukko hajoitetaan pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa mihinkään vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät 2 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 17 ja 19 original start mid end Alkio 17 kopioidaan aputaulukkoon aux i 1 j dest 30/80

31 Lomitusoperaation toteuttaminen Hajoita-vaiheessa taulukko hajoitetaan pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa mihinkään vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät 2 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 21 ja 19 Alkio 19 kopioidaan aputaulukkoon original aux start mid end i 1 17 dest j 31/80

32 Lomitusoperaation toteuttaminen Hajoita-vaiheessa taulukko hajoitetaan pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa mihinkään vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät 2 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 dest j 32/80

33 Lomitusoperaation toteuttaminen Hajoita-vaiheessa taulukko hajoitetaan pienempiin peräkkäisiin osataulukoihin. Huom: näitä osataulukkoja ei tarvitse erikseen tallettaa mihinkään vaan riittää pitää kirjaa niiden alku- ja loppuindekseistä. Lomitusvaiheessa kulloinkin yhdistettävät 2 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 start mid end original aux /80

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, smallest f i r s t i f ( a ( i ) <= a ( j ) ) { aux ( dest ) = a ( i ) ; i += 1 } else { aux ( dest ) = a ( j ) ; j += 1 } dest += 1 } while ( i < mid ) { aux ( dest ) = a ( i ) ; i += 1; dest += 1 } / / Copy r e s t while ( j <= end ) { aux ( dest ) = a ( j ) ; j += 1; dest += 1 } / / 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 += 1 } } Algoritmin ajoaika on selvästikin Θ(k), missä k on kahden yhdistettävän osataulukon yhteenlaskettu koko 34/80

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 <= 1) return } / / A u x i l i a r y memory f o r doing merges val aux = new Array [ I n t ] ( a. l ength ) / / 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 ) / 2 / / 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 + 1, 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 + 1, end ) / / Merge the r e s u l t s } _mergesort ( 0, a. length 1) Algoritmi yllä jälleen kokonaislukutaulukoille, yleistäminen muille ja yleisille Ordered-piirteen toteuttaville tyypeille helppoa 35/80

36 Ajoaika-analyysiä Lomitusjärjestämisen ajoaika saadaan rekursioyhtälöstä T(n) = T( n/2 ) + T( n/2 ) + cn missä c on jälleen vakio Jos n on kahden potenssi, voidaan tehdä sijoitus n = 2 k ja saadaan T(2 k ) = T(2 k 1 ) + T(2 k 1 ) + c2 k = c2 k + 2T(2 k 1 ) Laajentamalla rekursiyhtälöä saadaan T(2 k ) = c2 k + 2(c2 k 1 + 2T(2 k 2 )) = c2 k + 2c2 k 1 + 4(c2 k 2 + 2T(2 k 3 )) =... = kc2 k Koska k = log 2 n, T(n) = cnlog 2 n = Θ(nlog 2 n) 36/80

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 2 n levels T (n/2) c n 2 T (n/2) c n 2 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 (1) c T (1) c T (1) c T (1) c T (1) c T (1) c T (1) c T (1) c nc Tässä on abstrahoitu pois pyöristämiset ja käytetty rekursioyhtälöä Total in all levels: nc log 2 n T(1) = C ja T(n) = T(n/2) + T(n/2) + cn Punaiset tekstit kuvaavat solmussa ja tasolla kokonaisuudessaan tehtävää työmäärää Rekursio pysähtyy kun n 2 i 1 eli kun i log 2 n; täten puussa on log 2 n tasoa 37/80

38 Kokeellista analyysiä Suuremmille taulukoille lomitusjärjestäminen on huomattavasti nopeampi ja paremmin skaalautuva kuin lisäysjärjestäminen 38/80

39 Satunnaisia kokonaislukuja sisältävillä taulukoilla lisäysjärjestäminen on kilpailukykyinen ainoastaan erittäin pienillä taulukoilla 39/80

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ä 40/80

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 <= 1) return val aux = new Array [ I n t ] ( a. l ength ) 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 ) / 2 _mergesort ( s t a r t, l e f t E n d ) _mergesort ( leftend + 1, end ) merge ( a, aux, s t a r t, l e f t E n d + 1, end ) } } _mergesort ( 0, a. length 1) } Yllä insertionsort(a, start, end) järjestää osataulukon a[start, end] lisäysjärjestysalgoritmilla 41/80

42 Tuloksena kohtuullinen vakiokertoiminen parannus ajoaikaan 42/80

43 Pikajärjestäminen 43/80

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 44/80

45 Idea osataulukon A[l, r], missä l r, järjestämiseksi: 1. Perustapaus: jos l = r, osataulukossa A[l, r] on vain yksi alkio ja se on täten järjestetty 2. Hajoita: valitaan jokin jakoalkio (engl. pivot element) p osataulukosta A[l, r] ja ositetaan A[l, r] kolmeen osataulukkoon A[l,q 1], A[q,q] ja A[q + 1,r] siten, että kaikki A[l,q 1] alkiot ovat pienempiä tai yhtä suuria kuin p, A[q,q] = [p] ja kaikki A[q + 1,r] alkiot ovat yhtä suuria tai suurempia kuin p Tämän askeleen jälkeen p on oikealla paikallaan 3. Hallitse: järjestetään osataulukot A[l, q 1] ja A[q + 1, r] 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 1) _ q u i c k s o r t ( lo, q 1) i f ( q + 1 < h i ) _ q u i c k s o r t ( q + 1, h i ) } i f ( a. length >= 2) _ q u i c k s o r t ( 0, a. length 1) } 45/80

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(0,7) after partition(0,7) quicksort(0,4) after partition(0,4) quicksort(2,4) after partition(2,4) quicksort(2,3) after partition(2,3) quicksort(6,7) after partition(6,7) /80

47 Sama puumuodossa esitettynä; toisin kuin lomitusjärjestämisessä, kutsupuu ei ole kovinkaan tasapainoinen input partition(0,7) quicksort(0,4) quicksort(6,7) partition(0,4) partition(6,7) quicksort(2,4) partition(2,4) quicksort(2,3) 17 7 partition(2,3) 7 17 sorted /80

48 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, 3rd 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 1 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 lo hi Jakoalkio p (punaisella) on osataulukon lopussa i j 21 > 20, lisätään j yhdellä 48/80

49 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, 3rd 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 1 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 1 ovat suurempia kuin jakoalkio 17 20, vaihdetaan alkiot kohdissa i ja j Lisätään i ja j yhdellä lo i j hi 49/80

50 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, 3rd 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 1 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 1 ovat korkeintaan yhtä suuria kuin p 19 20, vaihdetaan alkiot kohdissa i ja j Lisätään i ja j yhdellä lo i j hi 50/80

51 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, 3rd 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 1 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 1 ovat korkeintaan yhtä suuria kuin p 1 20, vaihdetaan alkiot kohdissa i ja j Lisätään i ja j yhdellä lo i j hi 51/80

52 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, 3rd 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 1 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 lo hi Siniset alkiot kohdissa lo,...,i 1 ovat korkeintaan yhtä suuria kuin p Syaanit alkiot kohdissa i,...,j 1 ovat suurempia kuin jakoalkio i j 52/80

53 Eräs osoitusalgoritmi kirjasta Introduction to Algorithms, 3rd 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 1 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 53/80

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 1 var j = l o while ( j < h i ) { i f ( a ( j ) <= p i v o t ) { i += 1; swap ( a, i, j ) } j += 1 } swap ( a, i + 1, h i ) i + 1 } 54/80

55 Kokeellinen vertailu Lomitus- ja pikajärjestäminen taulukoilla, joissa satunnaisia kokonaislukuja: 55/80

56 Lisäksi vielä Scala-standardikirjaston Array[Int].sorted ja java.util.arrays.sort 56/80

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) 57/80

58 Ajoaikavaativuus Edellisten kokeellisten tulosten perusteella pikajärjestämisen ajoaika on varmaankin O(nlog 2 n)? Esitetyllä perusversiolla asia ei kuitenkaan ole näin vaan pahimman tapauksen ajoaika on Θ(n 2 ) 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 1 alkion osataulukko on sama kuin ennen ositusta Rekursioyhtälöllä saadaan T(n) = Θ(n) + T(n 1) = Θ(n 2 ) 58/80

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(nlog 2 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.3 kirjassa Introduction to Algorithms, 3rd ed. (online via Aalto lib)) mutta tähän liittyvät vakiot ovat melko suuria Käytännöllisempi approksimaatio on ottaa jakoalkioksi osataulukon 3 satunnaisesti valitun alkion mediaani 59/80

60 Toinen yleinen ja helppo strategia on valita jakoalkio satunnaisesti tarkasteltavasta osataulukosta Taulukoille, joissa on n erisuuruista alkiota, pikalajittelun odotettu ajoaika on O(nlog 2 n) kun valitaan satunnainen jakoalkio (kappale 7.4 kirjassa Introduction to Algorithms, 3rd 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 oli O(nlog 2 n) 60/80

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 1 Tällöin kokonaisajoaika on taas Θ(n 2 ) Tämä ongelma voidaan ratkaista paremmalla ositusalgoritmilla, joka tuottaa 3 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ä 61/80

62 Asymptoottisia alarajoja 62/80

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ä (32, 64 tms) Yksittäinen laskennan askel voi käsitellä vain jotain vakiomäärää bittejä Oletetaan lisäksi vain vertailuja -rajoitus, missä 1. kahta alkiota voidaan vertailla operaatioilla =, <,, > ja 2. 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 63/80

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 2 n) vertailua pahimmassa tapauksessa Täten puolitushakualgoritmi on, asymptoottisessa mielessä, optimaalinen n-alkioisen taulukon järjestäminen vaatii Ω(nlog 2 n) vertailua pahimassa tapauksessa Täten lomitusjärjestäminen on asymptoottisessa mielessä optimaalinen Todistukset: kappale 8.1 kirjassa Introduction to Algorithms, 3rd ed. (online via Aalto lib) 64/80

65 Laskemis- ja kantalukujärjestäminen 65/80

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ä 66/80

67 Laskemisjärjestäminen Oletetaan, että esiintyvät alkiot ovat lukuja {0,..., k 1} jollekin kohtuullisen pienelle arvolle k (tai helposti kuvattavissa tälle joukolle) Esimerkiksi jos tahdotaan järjestää taulukollinen tavuja, niin k = 256 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 67/80

68 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen original counting-sort(a): // 1: Allocate and init arrays count int-array of length k result int-array of length A.length count for v in 0 until k: count[v] 0 // 2: Count occurrences for i in 0 until A.length: count[a[i]] +=1 result // 3: Cumulative occurrences cumu 0 Kohta 1 for v in 0 until k: current count[v] Varataan apu- ja tulostaulukot count[v] cumu Alustetaan aputaulukko count arvoilla 0 cumu+=current // 4: Make the result Vie ajan Θ(k) for i in 0 until A.length: result[count[a[i]]] A[i] Tässä k = 8 count[a[i]] +=1 68/80

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

70 Esimerkki: Oktaalijärjestelmän numeroita sisältävän taulukon järjestäminen original counting-sort(a): // 1: Allocate and init arrays count int-array of length k result int-array of length A.length count for v in 0 until k: count[v] 0 index // 2: Count occurrences for i in 0 until A.length: count[a[i]] +=1 // 3: Cumulative occurrences cumu 0 for v in 0 until k: current count[v] count[v] cumu cumu+=current // 4: Make the result for i in 0 until A.length: result[count[a[i]]] A[i] count[a[i]] += Kohta 3 result Jokaiselle arvolle j lasketaan luku index[j] = j 1 l=0 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) 70/80

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

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

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

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

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 75/80

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 0,..., k 1 ja tahdotaan järjestää ne sanakirjajärjestykseen Esimerkiksi 32-bittiset kokonaisluvut ovat sekvenssejä, jotka koostuvat 4 kpl 8-bittisiä tavuja (numeroita välillä 0 255) ASCII-merkkijonot ovat sekvenssejä ASCII-merkkejä (numeroita välillä 0 127) 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 76/80

77 Ominaisuuksia: Vakaa Tarvitsee määrän Θ(k + n) lisämuistia Toimii ajassa O((k + n)d), missä d on tarkasteltavien alkioiden numeroesityksen maksimipituus 77/80

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 {0,..., k 1} 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 32-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 78/80

79 Ominaisuuksia: vakaa tarvitsee lisätilaa määrän Θ(k + n) toimii ajassa O((k + n)d) Esimerkki: 16-bittisten etumerkittömien lukujen järjestäminen vähiten merkitsevä numero ensin -kantalukujärjestämisellä 4-bittiä kerrallaan 0 0f22 0 0a e02 1 0f60 1 1e a80 2 0a f f22 3 0f60 3 0f f stable sort with the last digit as the key 4 1e stable sort with the second last digit as the key stable sort with the third last digit as the key a80 6 1e02 stable sort with the fourth last digit as the key 4 0fff fff f60 7 0f22 7 1e a80 8 0f fff 9 0fff 9 0fff /80

80 Toteutus ja kokeellinen tarkastelu Ohjelmointitehtävänä 80/80

Kierros 2: Järjestämisalgoritmeja

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

Lisätiedot

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Kierros 4: Binäärihakupuut

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

Lisätiedot

Algoritmit 2. Luento 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Lisätiedot

Algoritmit 1. Demot Timo Männikkö

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

Lisätiedot

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

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

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

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

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

Luku 8. Aluekyselyt. 8.1 Summataulukko

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

Lisätiedot

Algoritmit 1. Luento 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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