4. Sekvenssit Astetta soveltavat sekvenssit

Koko: px
Aloita esitys sivulta:

Download "4. Sekvenssit Astetta soveltavat sekvenssit"

Transkriptio

1 4. Sekvenssit Sekvenssit edustavat lineaarisesti järjestettyä alkioiden kokoelmaa, jolle on määritelty metodit alkion saantia, lisäystä ja poistoa varten. Täten sen jokaisella alkiolla on edeltäjä, paitsi ensimmäisellä, ja seuraaja, paitsi viimeisellä. Sekvenssi on yleistetty listarakenne verrattuna edellä kuvattuihin rajoitettuihin listoihin, so. pinoon, jonoon ja kaksiiseen jonoon, joissa päästiin suoraan vain ensimmäiseen tai viimeiseen alkioon käsiksi. Tässä osassa annetaan kaksi toteutustapaa sekvenssitietorakenteelle, taulukko ja kaksoislinkitetty lista. Esitellään käsitteet aste (rank) ja paikka (position). Aste osoittaa olion suhteellista järjestystä sekvenssissä, ja paikka kuvaa olioiden sijainnin sekvenssissä Astetta soveltavat sekvenssit Sekvenssin S kaikkiin n alkioihin e liittyy kokonaisluku aste väliltä [0,n-1] ollen sama kuin alkiota e edeltävien alkioiden lukumäärä. On huomattava, että tämä yhteys ei kuitenkaan merkitse, että välttämättä taulukkoa käytettäisiin toteutusvälineenä. Jos alkion aste on r, niin sen edeltäjän aste on r-1 ja seuraajan r+1, mikäli nämä ovat olemassa. Aste voi muuttua päivityksen takia. Mm. lisättäessä uusi alkio sekvenssin alkuun kaikkien muiden alkioiden aste kasvaa yhdellä. Aste on yksinkertainen, mutta tehokas käsite, sillä sillä voidaan määrätä, mihin sekvenssissä lisätään uusi alkio tai mistä sieltä poistetaan. Sekvenssin alkion aste on ajan ja sijainnin funktio, ja alkio asetetaan sekvenssiin näiden perusteella eikä alkion arvon. 4. kappale kappale 122 Esim Oheisena on sarja asteeseen perustuvia lisäyksiä ja poistoja alunperin tyhjään sekvenssiin S. operaatio tulos S lisää 7 astetta 0 - (7) lisää 4 astetta 0 - (4,7) palauta alkio astetta 1 7 (4,7) lisää 2 astetta 2 - (4,7,2) palauta alkio astetta 3 virhe (4,7,2) poista alkio astetta 1 7 (4,2) lisää 5 astetta 1 - (4,5,2) lisää 3 astetta 1 - (4,3,5,2) lisää 9 astetta 4 - (4,3,5,2,9) palauta alkio astetta 2 5 (4,3,5,2,9) 4. kappale 123 Astetta soveltavan sekvenssin abstrakti tietotyyppi Sekvenssiin s liittyvät seuraavat perusmetodit. elematrank(r): Palauttaa sekvenssistä S alkion astetta r. Mikäli on r<0 tai r>n-1, jossa n on alkioiden määrä, annetaan virheilmoitus. Syöte: kokonaisluku Tulos: alkio replaceelematrank(r,e): Korvaa alkiolla e alkion astetta r ja palauttaa tämän. Mikäli on r<0 tai r>n-1, jossa n on alkioiden määrä, annetaan virheilmoitus. Syöte: kokonaisluku r ja alkio e Tulos: alkio insertelematrank(r,e): Lisää uuden alkion e r-asteisena sekvenssiin S. Mikäli on r<0 tai r>n, jossa n on alkioiden määrä, annetaan virheilmoitus. Syöte: kokonaisluku r ja alkio e 4. kappale 124

2 removeelematrank(r): Poistaa r-asteisen alkion sekvenssistä S. Mikäli on r<0 tai r>n-1, jossa n on alkioiden määrä, annetaan virheilmoitus. Syöte: kokonaisluku Tulos: alkio Lisäksi tarvitaan tavanomaiset metodit size() ja isempty(). Metodien joukko on vähäinen, mutta riittävä toteuttamaan kaksiisen jonon abstraktin tietotyypin. Seuraavassa ovat vastaavuudet. Taulukkoon perustuva toteutus kaksiisen jonon metodi size() isempty() first() last() insertfirst(e) insertlast(e) removefirst() removelast() toteutus sekvenssillä size() isempty() elematrank(0) elematrank(size()-1) insertelematrank(0,e) insertelematrank(size(),e) removeelematrank(0) removeelematrank(size()-1) 4. kappale 125 Astetta soveltavan sekvenssin tietotyyppi on helppo toteuttaa taulukolla S, jossa S[i] sisältää astetta i olevan alkion tai viittauksen tähän. Taulukon koko N valitaan riittävän suureksi, ja alkioiden määrästä n pidetään tietoa yllä. Sekvenssin abstraktin tietotyypin metodien toteutukset ovat varsin yksinkertaisia. Esimerkiksi lisäyksen ja poiston (koodi 4.1.) yhteydessä käsitellään astetta r olevaa alkiota ja siirretään sen jälkeisiä alkioita yhden asteen verran jompaankumpaan suuntaan (kuva 4.1.). 4. kappale 126 Algorithm insertelematrank(r,e): if r n-1 for i = n-1, n-2,.., r do S[i+1] S[i] S[r] e n n+1 Algorithm removeelematrank (r): e S[r] for i = r, r+1,, n-2 do S[i] S[i+1] n n-1 return e S S r n-1 N-1 (a) r n-1 N-1 (b) Kuva 4.1. Taulukkoon perustuva sekvenssin toteutus: (a) siirto eteenpäin taulukossa lisäystä varten asteessa r ja (b) siirto takaisinpäin poistoa asteessa r varten. Koodi 4.1. Taulukkoon perustuvat 4. sekvenssin kappale lisäys- ja poistometodit kappale 128

3 Taulukossa on kuvattujen metodien pahimman tapauksen suoritusajat. Esim. metodin insertelematrank(e,r) suoritusaika pahimmassa tapauksessa on O(n) sillä, kun r=0, on siirrettävä kaikki alkiot eteenpäin taulukossa. Samoin on poistossa. On myös Θ(n), koska keskimäärin on siirrettävä n/2 alkiota. Toteutuksen käyttämä tila on O(N). Taulukko 4.1. Astetta soveltavan sekvenssin taulukkototeutuksen suoritusajat. metodi size, isempty elematrank, replaceelematrank insertelematrank, removeelematrank suoritusaika O(1) O(1) O(n) Tällöin kaksiisen jonon toteutus metodien insertlast ja removelast osalta toimivat ajassa O(1), mutta metodien insertfirst ja removefirst osalta ajassa O(n). Taulukkoon perustuvaa toteutusta pystytään kuitenkin muokkaamaan niin, että sekä lisäykset että poistot sekvenssin alussa ja lopussa voidaan suorittaa vakioajassa. Tämän suunnittelu jääköön harjoitustehtäväksi. Javassa on sisäänrakennettu luokka (Vector), jossa on käytettävissä samankaltaisia metodeja kuin astetta soveltavan sekvenssin. Se on taulukkopohjainen tietorakenne, joka sallii olioiden astetta soveltavan saannin, lisäyksen ja poiston. Taulukon kokoa voidaan siinä dynaamisesti kasvattaa, eli ylivuodon uhatessa kopioidaan alkiot kooltaan tavallisesti kahdennettuun taulukkoon. 4. kappale kappale 130 alku Toteutus käyttäen kaksoislinkitettyä listaa Astetta soveltava sekvenssi voidaan toteuttaa myös kaksoislinkitetyllä listalla, mutta tällöin alkioiden astetta ei talleteta eksplisiittisesti sekvenssiin. Operaation elematrank(r) suorittamiseksi pitää lähteä listan jommastakummasta päästä ja kulkea haluttuun alkioon. Tehokkainta on valita näistä lyhyempi reitti, jolloin saanti tapahtuu ajassa O(min(r+1, n-r)), joka on O(n). Pahin tapaus sattuu, kun r = n/2. alku Baltimore Pariisi Providence (a) Baltimore Pariisi Providence Operaatiot insertelematrank(r,e) ja removeelematrank(r) lisäystä ja poistoa varten vaativat myös kulkemisen päästä kyseiseen alkioon asti, jonka aste on r. Niiden suoritusaika on vastaavasti O(min(r+1, n-r+1)), joka on O(n). Nämä on esitetty kuvassa kappale 131 New York (b) Kuva 4.2. Kaksoislinkitetyn listan (mukana alku- ja solmu vartijoina) päivitysoperaatiot: (a) ennen solmun lisäystä ja (b) uuden solmun luonti. 4. kappale 132

4 alku alku alku Baltimore New York Pariisi Providence (c) Baltimore New York Pariisi Providence (d) Kaksoislinkitetty lista vaatii tilaa vain O(n), kun taas taulukkototeutus ei ollut tässä niin taloudellinen. Huonona puolena on, että metodi elematrank vaatii ajan O(n) pahimmassa tapauksessa, kun taulukkototeutuksessa se oli O(1). Muuten suoritusajat olivat samat molemmissa toteutuksissa. Toisaalta muunlaisia lisäyksiä ja poistoja voidaan tehdä nopeasti kaksoislinkitetyssä listassa Paikkasekvenssit Baltimore New York Providence (e) Kuva 4.2. Kaksoislinkitetyn listan (mukana alku- ja solmu vartijoina) päivitysoperaatiot (jatkoa): (c) solmun lisäyksen jälkeen ja ennen solmun poistoa, (d) solmun poisto sekä (e) poiston jälkeen. Asteet eivät ole ainoa tapa viitata paikkaan, jossa alkio on sekvenssissä. Olkoonpa sekvenssi toteutettu taulukkona tai linkitettynä listana, on luonnollista käyttää solmuja (node) asteiden sijasta. Nyt esitetään menettely kuvata abstraktisti alkion paikka sekvenssissä, mikä on toteutustavasta riippumatonta. 4. kappale kappale 134 Paikat Solmuja käyttävät operaatiot Olkoon S kaksoislinkitettyyn listaan perustuva sekvenssi. Haluaisimme määritellä metodeja listalle S käyttäen listan solmuja parametreina. Esim. haluaisimme määritellä metodin, joka poistaisi listan solmuun v talletetun alkion Solmua käyttäen parametrina voitaisiin poistaa alkio ajassa O(1) linkittämällä ulos solmu edeltäjä- ja seuraajalinkkit (next ja prev) päivittämällä (ks. kuvaa 4.2.). Vastaavasti voitaisiin hoitaa lisäys. Edellistä varten otetaan käyttöön käsite sekvenssin paikka (position), joka esittää alkion sijainnin suhteessa toisiin sekvenssissä. Käsite paikka kapseloidaan, mikä sallii hyödynnettävän kaksoislinkitetyn listan tehokkuutta rikkomatta mitenkään olio-ohjelmoinnin sääntöä, että tietorakenteen käyttäytyminen abstrahoidaan pois toteutuksestaan. Tätä varten otetaan käyttöön alkioiden säiliö (container), joka käsittää alkiot määrätyissä paikoissaan ja pitää nämä lineaarisessa järjestyksessä. Paikka on abstrakti tietotyyppi seuraavine metodeineen: element(): Palauttaa alkion paikastaan. Tulos: alkio container(): Palauttaa sekvenssin, joka sisältää kyseisen alkion. Tulos: sekvenssi 4. kappale kappale 136

5 Paikkasekvenssin abstrakti tietotyyppi Paikkaa soveltaen määritellään abstrakti tietotyyppi metodeineen: first(): Palauttaa S:n ensimmäisen alkion paikan. Virhe seuraa S:n ollessa tyhjä. Tulos: paikka last(): Palauttaa S:n viimeisen alkion paikan. Virhe seuraa S:n ollessa tyhjä. Tulos: paikka before(p): Palauttaa S:n paikan p alkiota edeltävän alkion paikan. Virhe seuraa, jos on p on ensimmäinen alkio. Tulos: paikka after(p): Palauttaa S:n paikan p alkiota seuraavan alkion paikan. Virhe seuraa, jos p on viimeinen alkio. Tulos: paikka Edelliset metodit sallivat viittauksen sekvenssin suhteellisiin paikkoihin ja siirtymisen niiden välillä. Niiden ja säiliön metodien size ja isempty lisäksi käytetään seuraavia päivitysmetodeja, jotka saavat parametreinaan paikkaolioita tai palauttavat näitä: replace(p,e): Korvaa paikan p alkion alkiolla e ja palauttaa paikan aiemman alkion. Syöte: paikka p ja alkio e Tulos: alkio swap(p,q): Vaihtaa paikkojen p ja q alkiot keskenään. Syöte: kaksi paikkaa 4. kappale kappale 138 insertfirst(e): Lisää uuden alkion e sekvenssin S ensimmäiseksi alkioksi. Syöte: alkio e Tulos: lisätyn alkion e paikka insertlast(e): Lisää uuden alkion e sekvenssin S viimeiseksi alkioksi. Syöte: alkio e Tulos: lisätyn alkion e paikka insertbefore(p,e): Lisää uuden alkion e sekvenssiin S paikkaa p edeltäväksi. Syöte: alkio e ja paikka p Tulos: lisätyn alkion e paikka insertafter(p,e): Lisää uuden alkion e sekvenssiin S paikkaa p seuraavaksi. Syöte: alkio e ja paikka p Tulos: lisätyn alkion e paikka remove(p): Poistaa sekvenssistä S alkion paikasta p. Syöte: paikka Tulos: poistettu alkio 4. kappale 139 Esim Oheisena kuvataan sarja operaatioita alunperin tyhjään paikkasekvenssiin S. Muuttujilla p i viitataan paikkoihin. Sulkeissa esitetään talletettava olio. operaatio tulos S insertfirst(8) p 1 (8) (8) insertafter(p 1,5) p 2 (5) (8,5) insertbefore (p 2,3) p 3 (3) (8,3,5) insertfirst(9) p 4 (9) (9,8,3,5) before(p 3 ) p 1 (8) (9,8,3,5) last() p 2 (5) (9,8,3,5) remove(p 4 ) 9 (8,3,5) swap(p 1, p 2 ) - (5,3,8) replace(p 3, 7) 3 (5,7,8) insertafter(first(),2) p 5 (2) (5,2,7,8) 4. kappale 140

6 Paikkasekvenssin taulukkototeutus Tässä tapauksessa ei ole mielekästä suoraan tallettaa sekvenssin alkioita taulukkoon, sillä esim. lisättäessä taulukon alkuun uusi alkio ei ole keinoa ilmoittaa muille alkioille niiden asteen kasvaneen yhdellä (paikka määritellään aina suhteessa naapuripaikkoihin eikä niiden asteisiin). Baltimore New York Rooma Providence Edellisen sijasta talletetaan paikkaoliot taulukkoon ja alkiot paikkoihin. Viittauksien sekvenssiin S ja indeksiin i lisäksi paikkaolio p = A[i] käsittää p:hen liittyvän alkion. Tämä tietorakenne (kuva 4.3.) mahdollistaa taulukon selauksen muuttujan i päivittämiseksi niiden paikkojen osalta, joiden aste muuttuu lisäyksen tai poiston tähden. Tällöin paikkasekvenssin toteutukset toimivat ajassa O(n) metodeille insertfirst, insertbefore, insertafter ja remove, koska paikkaolioita on siirrettävä tilan tekemiseksi uutta alkiota varten tai poistetun jättämän tilan täyttämiseksi. Kaikki muut metodit toimivat ajassa O(1). 4. kappale 141 S N-1 Kuva 4.3. Paikkasekvenssin taulukkototeutus. 4. kappale 142 Taulukkoa voidaan jälleen hyödyntää rengasrakenteena. Nyt on mahdollista muokata metodia insertfirst niin, että se toimii ajassa O(1). Muut metodit pysyvät sitä vastoin suoritusajoiltaan entisellään. Lisäyksen tai poiston pahin tapaus esiintyy alkion ollessa astetta n/2. Paikkasekvenssin metodien suoritusajat rengasrakennetta soveltavan taulukon tilanteessa on kuvattu taulukossa 4.3. Paikkasekvenssin toteutus kaksoislinkitetyn listan avulla Vastaavasti kuin taulukon tapauksessa listassa solmut sisältävät viittauksen sekvenssiä edustavaan olioon. Käytössä on metodi, joka palauttaa solmuihin talletetut varsinaiset tietoalkiot. Solmut toimivat itsessään paikkoina. Listasta katsottuna ne ovat sen solmuja, mutta ulkoapäin katsoen ne ovat geneerisiä paikkoja. Esimerkiksi sekvenssin S paikka p lähtötietona voidaan toteuttaa metodi before(p) antamalla p.prev paitsi, jos tämä on ensimmäinen solmu, jolloin pitää antaa virheilmoitus. 4. kappale 143 Paikkasekvenssin kaikki metodit ovat toteutettavissa suoritusajassa O(1) kaksoislinkitetyn listan avulla, joka on näin ollen suositeltava toteutusmuoto (taulukko 4.3.). Tätä tarkempaa kuvausta ei tässä esitetä. Taulukko 4.3. Paikkasekvenssin taulukkoon (rengasrakenne) ja kaksoislinkitettyyn listaan perustuvien toteutusten vertailu, kun n on sekvenssin alkioiden määrä. Tilavaatimus listalle on O(n) ja taulukolle O(N), kun N on taulukon koko. operaatiot taulukko lista size, isempty, first, last, before, after O(1) O(1) replace, swap, insertfirst, insertlast O(1) O(1) insertafter, insertbefore, remove O(n) O(1) 4. kappale 144

7 4.3. Yleiset sekvenssit Yleistetty sekvenssi käsittää kaikki sekä astetta soveltavan että paikkasekvenssin metodit sisältäen siis asteen ja paikan monipuolista käyttöä. Sekvenssin abstrakti tietotyyppi Yleistetyn sekvenssin abstrakti tietotyyppi tukee kaikkien edellä kuvattujen sekvenssimetodien lisäksi myös seuraavia, asteen ja paikan käyttöä yhdistäviä metodeja: atrank(r): Palauttaa astetta r olevan alkion paikan. Syöte: kokonaisluku Tulos: paikka rankof(p): Palauttaa paikan p alkion asteen. Syöte: paikka Tulos: kokonaisluku 4. kappale 145 Tämän abstraktin tietotyypin määritelmä käy moniperinnän esimerkistä, koska se perii metodeja kahdesta ylitietotyypistä eli se on unioni kahdesta abstraktista tietotyypistä. Sekvenssitoteutusten vertailua Taulukko 4.4. esittää yleistetyn sekvenssin taulukkototeutuksen (rengasrakenteena) ja kaksoislinkitetyn listan toteutuksen suoritusaikojen vertailun. Tilavaatimus listalle on O(n) ja taulukolle O(N), kun N on taulukon koko. operaatiot taulukko lista size, isempty, first, last, before, after, O(1) O(1) replace, swap, insertfirst, insertlast atrank, rankof, elematrank, O(1) O(n) replaceelematrank insertafter, insertbefore, remove O(n) O(1) insertelematrank, removeelematrank O(n) O(n) 4. kappale 146 Toteutusvaihtoehdon voi valita sen mukaan, mitä metodeja pääasiassa sovelluksessa tarvitaan. Huomattavaa on myös tilan käyttö, jossa suhteessa listavaihtoehto on usein edullisempi, vaikka siinä tarvitaan hieman lisätilaa alkioidenvälisiä osoittimia varten Tapausesimerkki: sekvenssipohjainen kuplalajittelu Kuvataan sekvenssiä soveltava toteutus kuplalajittelua (bubble sort) varten. Kuplalajittelualgoritmi Tarkastellaan sekvenssiä, jossa mitä tahansa kahta perättäistä alkiota voidaan verrata keskenään ja asettaa suuruusjärjestykseen. Tämä algoritmi on ensimmäinen yksinkertainen menetelmä, jota käsitellään tärkeää lajitteluongelmaa silmällä pitäen. 4. kappale 147 Lajittelussa (sorting) on tehtävänä järjestää syötealkiot niin, että ne tulevat joko kasvavaan tai vähenevään järjestykseen. Tässä yhteydessä käsitellään ei-vähenevää eli tarkemmin ilmaisten kasvavaa tai osin samansuuruisten perättäisten alkioparien sekvenssiä. Alkiot voivat olla toki muitakin kuin lukuja, esim. leksikograafisesti järjestettäviä (tekstiä), mutta niiden välillä pitää olla jokin järjestysrelaatio voimassa, kuten tässä pienempi tai yhtä suuri. Kuplalajittelualgoritmi ratkaisee lajitteluongelman yksinkertaisella, mutta samalla asymptoottisesti melko tehottomalla tavalla. Siinä suoritetaan sarja vaiheita (pass) sekvenssissä (kuva 4.4.). Kussakin vaiheessa alkiot selataan astetta kasvattaen asteesta 0 vielä lajittelemattomien alkioiden sekvenssin un. Vaiheen jokaisessa paikassa alkiota verrataan naapuriinsa ja nämä kaksi perättäistä alkiota vaihdetaan keskenään, mikäli suhteellinen järjestys on väärä, so. edeltävä alkio on seuraavaa suurempi. Sekvenssi lajitellaan suorittamalla n tällaista vaihetta. 4. kappale 148

8 vaihe vaihdot sekvenssi (5, 7, 2, 6, 9, 3) , 7 6, 9 3 (5, 2, 6, 7, 3, 9) , 7 3 (2, 5, 6, 3, 7, 9) (2, 5, 3, 6, 7, 9) (2, 3, 5, 6, 7, 9) Kuva 4.4. Kuplalajittelu kokonaislukujen sekvenssille, jossa kunkin vaiheen vaihdot on esitetty ja sekvenssi vaihtojen jälkeen. Itse asiassa vaiheita on näiden jälkeen vielä kaksi, mutta niitä ei ole esitetty, koska niissä ei tapahdu vaihtoja. Olkoon n sekvenssin alkioiden lukumäärä. Kuplalajittelualgoritmilla on seuraavat ominaisuudet: Ensimmäisessä vaiheessa sen jälkeen, kun suurin alkio on saavutettu, jatketaan vaihtamista, kunnes päästään sekvenssin viimeiseen paikkaan. Toisessa vaiheessa, kun toiseksi suurin alkio on saavutettu, jatketaan vaihtamista, kunnes päästään toiseksi viimeiseen paikkaan. Eo. menettelyä toistetaan niin kauan, kunnes kaikki alkiot on käyty läpi. Täten i:nnen vaiheen lopussa sekvenssin i oikeanpuolimmaista alkiota (asteesta n-1 alas asteeseen n-i) ovat lopullisissa paikoissaan. Tämä osoittaa, että n vaihetta riittää alkioiden lajittelemiseksi ja kussakin vaiheessa i riittää lajitella ensimmäiset n-i+1 alkiota. 4. kappale kappale 150 Sekvenssipohjaisen kuplalajittelun analyysi Oletetaan sekvenssin toteutuksen sallivan yksittäisten alkioiden saannin ja vaihdon ajassa O(1). Tällöin i:nnen vaiheen suoritusaika on O(ni+1). Kokonaissuoritusajaksi tulee siten n O( ( n i+ 1)). i= 1 Edellisestä saadaan summan n n( n+ 1) i= 2 i= 1 Tämä voidaan kirjoittaa muotoon O( n+ ( n 1) ) = O( i). n i= 1 perusteella tulos O(n 2 ) suoritusajaksi edellyttäen, että vaihdot ja saanti olivat vakioaikaisia. Koodi 4.2. käsittää kaksi kuplalajittelun toteutusta lajiteltaessa kokonaislukuja. Ne eroavat alkion saannissa ja sekvenssin muuttamisessa käytettävien metodien suhteen. 4. kappale kappale 152

9 Metodi bubblesort1 hakee alkiot rajapintametodin atrank kautta. Se on astetta soveltava toteutus ja sovelias ainoastaan sekvenssin taulukkototeutuksessa, jossa atrank tarvitsee ajan O(1). Tällöin metodin kokonaissuoritusaika on O(n 2 ). Jos algoritmi toteutettaisiin kaksoislinkitetyn listan avulla, silloin jokainen metodin atrank kutsu vaatisi ajan O(n) pahimmassa tapauksessa ja kokonaissuoritusaika olisi O(n 3 ). Metodi bubblesort2 saa alkiot sekvenssistä metodien first ja after avulla. Se on paikkaa käyttävä toteutus ja sopiva sekä taulukkoa että kaksoislinkitettyä listaa hyödynnettäessä. Näin on, koska molemmat tavat tuottavat vakiollisen suoritusajan metodeille first ja after. Koko suoritusaika on Θ(n 2 ) sekvenssin toteutustavasta riippumatta. Kuplalajittelu on hyvin yksinkertainen, mutta se on myös varsin tehoton lajiteltavien määrän n kasvaessa aikakompleksisuuden ollessa neliöllinen. Myöhemmin palataan lajitteluun, jolle on olemassa merkittävästi tehokkaampia algoritmeja aikakompleksisuudeltaan O(n log n). 4. kappale 153 public void static bubblesort1(integersequence s) { int n = s.size(); for (int i=0; i<n; i++) // i:s vaihe for (int j=1; j<n-i; j++) if (s.atrank(j-1).element().intvalue() > s.atrank(j).element().intvalue()) swap(s.atrank(j-1), s.atrank(j)); } Koodi 4.2. Kuplalajittelun ensimmäinen toteutusversio. 4. kappale 154 public void static bubblesort2(integersequence s) { int n = s.size(); IntegerSequencePosition prec, succ; for (int i=0; i<n; i++) { // i:s vaihe prec = s.first(); for (int j=0; j<n-i; j++) { succ = s.after(prec); if (prec.element().intvalue() > succ.element().intvalue()) swap(prec,succ); prec = succ; } } } Koodi 4.2. (jatkoa) Kuplalajittelun toinen toteutusversio Iteraattorit Tyypillinen sekvenssin käyttötapa on käydä alkiot järjestyksessä läpi esim. jonkin alkion etsimiseksi tai muun toimenpiteen suorittamiseksi. Iteraattori (iterator) on käsite, joka abstrahoi tällaisen selausprosessin. Yleensä iteraattori sisältää sekvenssin, tiedon paikasta, jossa kulloinkin ollaan, ja menetelmän siirtyä seuraavaan paikkaan, josta tulee uusi nykyinen paikka. Niinpä tämä on tehokasta toteuttaa paikkasekvenssinä. Javassa on yksinkertaistettu iteraattori, abstrakti tietotyyppi enumeration. 4. kappale kappale 156

Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen

Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen Sekvenssi Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Timo Esim. pino, jono ja kaksiloppuinen jono ovat sekvenssin erikoistapauksia sekvenssejä, jotka kohdistavat operaationsa ensimmäiseen/viimeiseen

Lisätiedot

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen Viimeksi käsiteltiin pino: lisäys ja poisto lopusta jono: lisäys loppuun, poisto alusta Pinon ja jonon yleistävä tietorakenne: kaksiloppuinen jono alkion lisäys/poisto voidaan kohdistaa jonon alkuun tai

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

3. Pinot, jonot ja linkitetyt listat

3. Pinot, jonot ja linkitetyt listat 3. Pinot, jonot ja linkitetyt listat Pinot ja jonot ovat yksinkertaisimpia tietorakenteita, mutta myös tärkeimpiä. Niitä käytetään lukuisissa sovelluksissa ja monimutkaisten tietorakenteiden osina. Yksinkertaisuutensa

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

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit: Pino (stack) Pino: viimeisenä sisään, ensimmäisenä ulos (LIFO, Last In, First Out) -tietorakenne kaksi perusoperaatiota: alkion lisäys pinon päälle (push), ja päällimmäisen alkion poisto (pop) Push(alkio)

Lisätiedot

3. Pinot, jonot ja linkitetyt listat

3. Pinot, jonot ja linkitetyt listat 3. Pinot, jonot ja linkitetyt listat Pinot ja jonot ovat yksinkertaisimpia tietorakenteita, mutta myös tärkeimpiä. Niitä käytetään lukuisissa sovelluksissa ja monimutkaisten tietorakenteiden osina. Yksinkertaisuutensa

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

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

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

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

Lisätiedot

Algoritmit 1. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö Algoritmit 1 Luento 4 Ke 18.1.2017 Timo Männikkö Luento 4 Tietorakenteet Pino Pinon toteutus Jono Jonon toteutus Lista Listaoperaatiot Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 2/29 Pino Pino, stack,

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

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

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö Algoritmit 1 Luento 6 Ke 25.1.2017 Timo Männikkö Luento 6 Järjestetty lista Listan toteutus dynaamisesti Linkitetyn listan operaatiot Vaihtoehtoisia listarakenteita Puurakenteet Binääripuu Järjestetty

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

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

18. Abstraktit tietotyypit 18.1

18. Abstraktit tietotyypit 18.1 18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

Tieto- ja tallennusrakenteet

Tieto- ja tallennusrakenteet Tieto- ja tallennusrakenteet Sisältö Tyyppi, abstrakti tietotyyppi, abstraktin tietotyypin toteutus Tallennusrakenteet Taulukko Linkitetty rakenne Abstraktit tietotyypit Lista (Puu) (Viimeisellä viikolla)

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

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

3. Pinot, jonot ja linkitetyt listat

3. Pinot, jonot ja linkitetyt listat 3 Pinot, jonot ja linkitetyt listat Pinot ja jonot ovat yksinkertaisimpia tietorakenteita, mutta myös tärkeimpiä Niitä käytetään lukuisissa sovelluksissa ja monimutkaisten tietorakenteiden osina Yksinkertaisuutensa

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

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

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

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

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

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

Lisätiedot

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

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

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

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

Listarakenne (ArrayList-luokka)

Listarakenne (ArrayList-luokka) Listarakenne (ArrayList-luokka) Mikä on lista? Listan määrittely ArrayList-luokan metodeita Listan läpikäynti Listan läpikäynti indeksin avulla Listan läpikäynti iteraattorin avulla Listaan lisääminen

Lisätiedot

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö Algoritmit 1 Luento 1 Ti 10.1.2017 Timo Männikkö Luento 1 Algoritmi Algoritmin toteutus Ongelman ratkaiseminen Algoritmin tehokkuus Algoritmin suoritusaika Algoritmin analysointi Algoritmit 1 Kevät 2017

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

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

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

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

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla; Tietorakenteet, laskuharjoitus 7, ratkaisuja 1. Opiskelijarekisteri-luokka saadaan toteutetuksi käyttämällä kahta tasapainotettua binäärihakupuuta. Toisen binäärihakupuun avaimina pidetään opiskelijoiden

Lisätiedot

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

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

Lisätiedot

Algoritmit 2. Luento 4 Ke Timo Männikkö

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

Lisätiedot

TIETORAKENTEET JA ALGORITMIT

TIETORAKENTEET JA ALGORITMIT TIETORAKENTEET JA ALGORITMIT Timo Harju 1999-2004 1 typedef link List; /* Vaihtoehtoisia nimiä */ typedef link Stack; /* nodepointterille */ typedef link Queue typedef struct node Node; /* itse nodelle

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

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

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 1. Luento 9 Ti Timo Männikkö Algoritmit 1 Luento 9 Ti 7.2.2017 Timo Männikkö Luento 9 Graafit ja verkot Kaaritaulukko, bittimatriisi, pituusmatriisi Verkon lyhimmät polut Floydin menetelmä Lähtevien ja tulevien kaarien listat Forward

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

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

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

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

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. Demot Timo Männikkö

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

Lisätiedot

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

Lyhyt kertaus osoittimista

Lyhyt kertaus osoittimista , syksy 2007 Kertausta Luento 10 12.10.2007 Syksy 2007 1 Lyhyt kertaus osoittimista char *p; /* char, int, jne ilmoittavat, minkä tyyppisiä */ Keskusmuisti int *q; /* olioita sisältäviin muistilohkoihin

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

A274101 TIETORAKENTEET JA ALGORITMIT

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

Lisätiedot

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö Algoritmit 2 Luento 5 Ti 26.3.2019 Timo Männikkö Luento 5 Puurakenteet B-puu B-puun korkeus B-puun operaatiot B-puun muunnelmia Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 2/34 B-puu B-puut ovat tasapainoisia

Lisätiedot

10. Painotetut graafit

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

Lisätiedot

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

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003 Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003 Matti Nykänen 5. joulukuuta 2003 1 Satelliitit Muunnetaan luennoilla luonnosteltua toteutusta seuraavaksi: Korvataan puusolmun p kentät p. key ja

Lisätiedot

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi Imperatiivisen ohjelmoinnin peruskäsitteet muuttuja muuttujissa oleva data voi olla yksinkertaista eli primitiivistä (esim. luvut ja merkit) tai rakenteista jolloin puhutaan tietorakenteista. puhuttaessa

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

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

Lisätiedot

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

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

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

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

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint. Yleiset hakupuut 4 Monitiehakupuu: Binäärihakupuu 0 1 3 5 6 7 8 v k 1 k k 3 v v 3 v 4 k 1 k 3 k 1 k k k 3 d lapsisolmua d 1 avainta Yleinen hakupuu? Tietorakenteet, syksy 007 1 Esimerkki monitiehakupuusta

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

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

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ... 1. Tietorakenteet Tietorakenteet organisoivat samankaltaisten olioiden muodostaman tietojoukon. Tämä järjestys voidaan saada aikaan monin tavoin, esim. Keräämällä oliot taulukkoon. Liittämällä olioihin

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

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

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

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, , vastauksia 58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, 25.2.2013, vastauksia 1. (a) O-merkintä Ω-merkintä: Kyseessä on (aika- ja tila-) vaativuuksien kertalukumerkinnästä. O-merkintää käytetään ylärajan

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Pino Pinon määritelmä Pinon sovelluksia Järjestyksen kääntäminen Palindromiprobleema Postfix-lausekkeen laskenta Infix-lausekkeen muunto postfix-lausekkeeksi Sisäkkäiset funktiokutsut

Lisätiedot

2. Perustietorakenteet

2. Perustietorakenteet 2. Perustietorakenteet Tässä osassa käsitellään erilaisia perustietorakenteita, joita algoritmit käyttävät toimintansa perustana. Aluksi käydään läpi tietorakenteen abstrakti määritelmä. Tämän jälkeen

Lisätiedot

STL:n uudistukset. Seppo Koivisto TTY Ohjelmistotekniikka

STL:n uudistukset. Seppo Koivisto TTY Ohjelmistotekniikka STL:n uudistukset Seppo Koivisto TTY Ohjelmistotekniikka 2012-05-04 Sisältö 1 Muutokset säiliöihin ja uudet säiliötyypit 2 3 4 5 STL:n säiliöt Viitteet ja osoittimet ovat muuttuneet: Allocator::reference

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

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

Algoritmit 2. Luento 6 To Timo Männikkö

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

Lisätiedot

811312A Tietorakenteet ja algoritmit, , Harjoitus 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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja

Lisätiedot

4. Joukkojen käsittely

4. Joukkojen käsittely 4 Joukkojen käsittely Tämän luvun jälkeen opiskelija osaa soveltaa lomittuvien kasojen operaatioita tuntee lomittuvien kasojen toteutuksen binomi- ja Fibonacci-kasoina sekä näiden totetutusten analyysiperiaatteet

Lisätiedot

1. Mitä tehdään ensiksi?

1. Mitä tehdään ensiksi? 1. Mitä tehdään ensiksi? Antti Jussi i Lakanen Ohjelmointi 1, kevät 2010/ Jyväskylän yliopisto a) Etsitään Googlesta valmis algoritmi b) Mietitään miten itse tehtäisiin sama homma kynällä ja paperilla

Lisätiedot

puuta tree hierarkkinen hierarchical

puuta tree hierarkkinen hierarchical 4. Puut Seuraavaksi käsitellään yhtä tärkeimmistä tietojenkäsittelytieteen ei-lineaarisista käsitteistä, puuta (tree). Puut ovat olleet keksintönä todellinen läpimurto, koska niissä luotiin tehokas eilineaari

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Lisätiedot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi

Lisätiedot

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public) Tietorakenteet JAVA-OHJELMOINTI Osa 5: Tietorakenteita Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto Olioita ja tietoja voidaan organisoida määrämuotoisiksi tietorakenteiksi Hyödyllisiä

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

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

Tietorakenteet, laskuharjoitus 6,

Tietorakenteet, laskuharjoitus 6, Tietorakenteet, laskuharjoitus, 23.-2.1 1. (a) Kuvassa 1 on esitetty eräät pienimmistä AVL-puista, joiden korkeus on 3 ja 4. Pienin h:n korkuinen AVL-puu ei ole yksikäsitteinen juuren alipuiden keskinäisen

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

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

4 Tehokkuus ja algoritmien suunnittelu

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

Lisätiedot

Algoritmit 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

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

Tarkennamme geneeristä painamiskorotusalgoritmia

Tarkennamme geneeristä painamiskorotusalgoritmia Korotus-eteen-algoritmi (relabel-to-front) Tarkennamme geneeristä painamiskorotusalgoritmia kiinnittämällä tarkasti, missä järjestyksessä Push- ja Raise-operaatioita suoritetaan. Algoritmin peruskomponentiksi

Lisätiedot