Algoritmit ja tietorakenteet / HL Copyright Hannu Laine

Koko: px
Aloita esitys sivulta:

Download "Algoritmit ja tietorakenteet / HL Copyright Hannu Laine"

Transkriptio

1 1 Pino ja jono Yleistä Pino Pino ja jono ovat abstrakteja tietotyyppejä, joilla on yleistä käyttöä. Pino ja jono ovat listan erikoistapauksia. Kummassakin tapauksessa erona on se, että tietotyypin operaatiofunktioita on rajoitettu. Pino ja jono ovat lineaarisen listan erikoistapauksia, joissa vain osa listan operaatioista on sallittuja. Määritelmä. Pino on järjestettyjen alkioiden kokoelma, jossa lisäykset tapahtuvat aina loppuun ja samoin alkion otto on mahdollista vain lopusta. Tässä tapauksessa loppua kutsutaan pinon huipuksi (top). Pinon tapauksessa alkioiden järjestyksen määrää syöttöjärjestys. Pinon operaatiot ovat: initialize (alustaa pinon) push (vie alkion pinon päälle) pop (ottaa alkion pinon päältä) is_empty (testaa, onko pino tyhjä) Pinon sovelluksia. Pinoa voidaan käyttää mitä erilaisimpien probleemoiden ratkaisuissa. Periaatteessa pino on tietoalkioiden säiliö, josta saadaan tiedot ulos käännetyssä järjestyksessä siihen nähden kuin ne on säiliöön viety. Voidaan myös sanoa, että pinoon viimeksi viety alkio saadaan ulos ensimmäiseksi. Siksi pinoa kutsutaan LIFO:ksi (Last In First Out list). Yhtä hyvin voidaan sanoa, että pinoon ensiksi viety alkio saadaan ulos viimeiseksi (First In Last Out : FILO). Yksinkertaisimmillaan pinoa voidaan käyttää tiedon järjestyksen kääntämiseen. Jos esimerkiksi pitää kääntää merkkijonon merkit päinvastaiseen järjestykseen, se voidaan tehdä siten, että viedään kaikki merkkijonon merkit ensimmäisestä alkaen ensin merkkien pinoon. Sen jälkeen ne otetaan pois pinosta ja viedään takaisin alkuperäiseen merkkijonoon taas ensimmäisestä alkaen. Jos olisi kirjoitettava ohjelma, joka selvittää, onko syötetty merkkijono palindromi vai ei, se voitaisiin tehdä siististi käyttämällä kolmea merkkipinoa. Tutkittavan merkkijonon merkit vietäisiin ensin kahteen merkkipinoon, merkkipinoon 1 ja 2. Sen jälkeen siirrettäisiin kaikki merkit pinosta 2 pinoon 3. Alkuperäinen merkkijono on palindromi, jos pinosta 1 ja pinosta 3 tasatahtiin otettavat merkit ovat loppuun saakka (kunnes pinot tyhjenevät) samoja. Kun monista osista rakentuva laite puretaan, saattaa olla vaikeuksia koota laite uudelleen. Asiaa helpottaa, jos laaditaan ohjelma, joka käyttää pinoa. Kun laite puretaan, syötetään ohjelmalle aina irrotettavan osan tunnus, nimi tai koodi. Ohjelma vie osan tiedot pinoon. Kun laitetta kootaan, ohjelmalta kysytään, mikä osa asennetaan seuraavaksi. Ohjelma ottaa osan koodin pinosta. Näin tulee varmistettua, että osat kootaan päinvastaisessa järjestyksessä kuin ne on purettu. Postfix-muodossa olevan laskulausekkeen laskemisessa käytetään hyväksi pinoa. RPNlaskimissa käytetään tällaista merkintätapaa. Silloin esimerkiksi laskulauseke (2+3)/5 merkitään /. Postix-muodossa olevan lausekkeen tulkinta on koneellisesti paljon helpompi kuin infix-muodossa olevan lausekkeen tulkinta. Kysymys on siitä, että postfixmerkintäisen lausekkeen laskennassa voidaan aina edetä selkeästi vasemmalta oikealle ja

2 2 päätös tehtävästä toimenpiteestä voidaan tehdä välittömästi sen perusteella, mitä lausekkeesta on juuri löytynyt. Lausekkeen laskenta perustuu seuraaviin yksinkertaisiin sääntöihin: 1. Jos lausekkeesta löytyy operandi, se viedään pinoon. 2. Jos lausekkeesta löytyy operaattori, pinosta otetaan kaksi operandia, niille tehdään operaattorin mukainen operaatio ja tulos viedään pinoon. Kun koko lauseke on käyty läpi, pinossa on lausekkeen lopputulos. Sellaisen ohjelman kirjoittaminen, joka laskee infix-muotoisen aritmeettisen lausekkeen, joka voi sisältää myös ennalta määräämättömän määrän sulkumerkkejä, ei ole aivan yksinkertainen juttu. Näin siinä tapauksessa, jos ei ole tietoa pinon soveltamismahdollisuudesta (eikä rekursiosta). Edellä todettiin, että postix-merkintäisen lausekkeen laskenta puolestaan on hyvin suoraviivaista. Siksi yksinkertaisin menettely infix-merkintäisen lausekkeen laskemiseksi onkin kaksivaiheinen: 1. Muunnetaan infix-merkintäinen lauseke ensin postfix-merkintäiseksi. 2. Lasketaan sitten saatu postfix-merkintäinen lauseke. Edellä todettiin, että postfix-merkintäisen lausekkeen laskemisessa tarvittiin operandien pinoa. Infix-merkintäisen lausekkeen muuntamisessa postfix-merkintäiseksi tarvitaan puolestaan operaattorien pinoa. Tässä prosessissa käydään infix-merkintäistä lauseketta läpi vasemmalta oikealle seuraavan logiikan mukaan: 1. Jos infix-lausekkeesta löytyy operandi, se viedään suoraan posfixlausekkeen perään. 2. Jos infix-lausekkeesta löytyy operaattori, se viedään operaattorien pinoon. Sitä ennen kuitenkin pinosta otetaan pois kaikki sellaiset operaattorit, jotka ovat vahvempia tai yhtä vahvoja kuin tämä infix-lausekkeesta nyt löytynyt. Kaikki pinosta otetut operaattorit viedään postfix-lausekkeen loppuun. 3. Lopuksi pinosta otetaan pois kaikki operaattorit ja ne viedään postfixlausekkeen loppuun. Huomautus. Myös sulkumerkkejä voidaan pitää operaattoreina ja niille voidaan antaa asianmukaiset vahvuudet. Pinorakennetta käytetään tietokoneissa hyväksi esimerkiksi parametrien ja paikallisten muuttujien tilanvarauksessa funktioiden yhteydessä. Tällä saavutetaan etu, että funktio voi kutsua edelleen seuraavaa funktiota ja se taas seuraavaa jne. Kun funktiokutsusta palataan, kutsunut funktio saa taas käyttöönsä oman data-alueensa pinossa, sillä kutsutun funktion dataalue poistetaan pinon päältä. Parametrien ja paikallisten muuttujien varaaminen pinosta tekee mahdolliseksi myös rekursiivisten funktioiden laatimisen (näihin palataan myöhemmin). Pinon avulla on helposti toteutettavissa myös yksinkertainen rivieditori, jossa rivin lopusta voidaan poistaa merkkejä Backspace-painikkeella. Merkin syöttö tarkoittaa push-operaatiota, ja Backspace-painikkeen painallus pop-operaatiota. Myös ikkunoitu valikkojärjestelmä, jossa valikosta voidaan valita alavalikko, siitä edelleen alavalikon alavalikko jne, voidaan toteuttaa valikoiden pinona. Tällöin valikoista päästään kätevästi takaisin samaa reittiä alkuvalikkoon. Pinon taulukkototeutus 1: Listan taulukkototeutuksen yhteydessä mainittiin eräänä haittapuolena, että alkioiden lisäys ja poisto edellytti tietojen siirtoa taulukossa. Kun pinon tapauksessa alkioiden järjestys määräytyy aina syöttöjärjestyksestä, ja kun otto voi tapahtua vain lopusta, ei tällaista haittatekijää ole. Siksi taulukkototeutus pinolle on erittäin kätevä varsinkin silloin, kun pinon maksimikoko on etukäteen tiedossa.

3 3 Liitteenä on C-kielinen toteutus pinosta. Siinä pääohjelma, jolla pinoa voidaan testata, on sellainen, että se lukee näppäimistöltä merkin. Jos merkki on kirjain, ohjelma vien merkin pinoon. Jos syötetty merkki on 1, niin ohjelma ottaa merkin pinosta ja tulostaa sen näyttöön. Testauksen ja kokeilun selkiyttämiseksi pinolle on tehty myös ylimääräinen operaatio print, joka tulostaa ruutuun koko pinon sisällön. Vaikka esimerkkitoteutus on merkkipino, on huomattava, että toteutus on täysin riippumaton pinottavien alkioiden tyypistä. Muutos saadaan aikaan määrittelemällä tietotyyppi Titem uudelleen (poikkeuksena on print-funktio, jossa oletetaan, että alkion tyyppi on merkki). Myös pääohjelma olisi mahdollista saada riippumattomaksi pinottavien alkioiden tyypistä, jos siinä sovellettaisiin abstraktiota pinottaviin alkioihin. Tämä tarkoittaisi että, pinottavat alkiot tulisi toteuttaa abstrakteina tietotyyppeinä, joilla on omat operaatiofunktiot lue_alkio ja tulosta_alkio. Taulukkototeutuksen ideana on, että pinoon vietävät alkiot talletetaan taulukkoon. Pinon huippu (kenttä top) ilmoittaa aina sen paikan taulukossa, jossa sijaitsee viimeksi pinoon viety alkio. Huipun arvo -1 merkitsee tyhjää pinoa. Pinon tallennusrakenne on silloin seuraavan kuvan mukainen. Tstack array top Abstraktin tietotyypin käyttö on toteutuksesta riippumaton Seuraavassa demonstroidaan, että abstraktin tietotyypin käyttö on riippumaton abstraktin tietotyypin sisäisestä toteutuksesta niin kauan, kuin tietotyypin liityntärajapinta (tietotyypin nimi ja operaatiofunktioiden prototyypit) pysyvät muuttumattomina. Liitteenä on myös pinon taulukkototeutus 2. Siinä taulukon alkioihin viitataan osoittimilla, eikä indeksillä niin kuin taulukkototeutuksessa 1 tehtiin. Listauksesta nähdään, että tietotyypin Tstack määrittely on nyt erilainen ja tämän seurauksena myös operaatiofunktioiden toteutukset ovat erilaisia kuin taulukkototeutuksessa 1. Siitä huolimatta sovellus (pääohjelma) on täsmälleen sama kuin taulukkototeutuksessa 1. Sovellukseen on siis vaihdettu uusi komponentti (pino) siten, että sovelluksessa ei ole tarvinnut tehdä mitään muutosta. Sovellus on vain käännetty uudelleen ja siihen on linkattu uusi pino. Tässä ratkaisussa käytetty pinon tietojen tallennusrakenne on seuraavan kuvan mukainen. Ajatuksena on, että osoitin top sisältää pinon päällimmäisen alkion osoitteen taulukossa (NULL edustaa tyhjää pinoa). Osoitin minpointer osoittaa aina taulukon ensimmäistä alkiota ja maxpointer sen viimeistä alkiota. Näitä käytetään taulukon ylivuodon estämiseen ja sen tilanteen tunnistamiseen, kun pinosta otettiin viimeinen alkio.

4 4 Tstack array top maxpointer minpointer Taulukkototeutus 2 on tehokkaampi kuin taulukkototeutus 1, koska nyt tietojen hakemiseen ja viemiseen taulukkoon ei käytetä indeksointia, joka käännetyssä koodissa merkitsee kertolaskun suoritusta. Taulukkototeutuksessa 2 lisäyksessä ja poistossa on vain osoittimen kasvatus tai vähennys alkion koolla eli niissä ei tarvita kertolaskua. Näissä molemmissa taulukkototeutuksissa on ongelmana taulukon kiinteä koko. Taulukon koko määräytyy jo käännösaikana ja sitä ei voida kasvattaa ajon aikana. Tämä ongelma voidaan korjata siirtymällä dynaamisen taulukon käyttöön. Yksinkertaisimmillaan asia voitaisiin toteuttaa siten, että funktiossa initialize_stack annettaisiin parametrina alkioiden maksimimäärä ja samassa funktiossa varattaisiin taulukko, johon mahtuu tämä määrä alkioita. Tällaisessa ratkaisussa pinotietueessa tulee säilyttää myös taulukon koko, jotta pushoperaatiossa voidaan testata, vieläkö pinoon mahtuu alkioita. Tämä olisi kuitenkin vain pieni askel parempaan. Siitä seuraisi myös, etä pinon interface olisi nyt erilainen alustusoperaation kohdalla. Tässä ratkaisussa alustusoperaatiolla olisi int-tyyppinen parametri, kun sillä aikaisemmin ei ollut parametriä. Tämän takia pinoa käyttävien sovellusten alustusfunktion kutsu olisi muutettava uuteen muotoon C-kieltä käytettäessä. Tämä on vakava puute, jos puhutaan komponenttiajattelusta ja komponenttien vaihtokelpoisuudesta. C++-kieltä käytettäessä ei tässä tapauksessa tarvitsisi muuttaa pinoa käyttäviä sovelluksia. Tämä johtuu funktioiden ylikuormitusmahdollisuudesta. Uudessa pinon toteutuksessa voitaisiin säilyttää myös vanha operaatiofunktio alustukseen, jossa parametriä ei ole. Tämän funktion sisällä käytettäisiin taulukon kokona sopivaa oletusarvoa. Huomautus 1. Myös C++:n mahdollisuus antaa parametreille oletusarvo, tarjoaisi saman mahdollisuuden. Dynaamisen taulukon avulla voidaan toteuttaa myös automaattisesti tarvittaessa kasvava pino. Silloin ei kannata antaa alkukokoa parametrina, vaan varataan joku kiinteä koko aluksi. Kun tämä tila on käytetty voidaan varata uusi isompi taulukko. Kaikki jo tallennetut tiedot siirretään silloin vanhasta taulukosta uuteen ja alkuperäinen taulukko vapautetaan. Näin saadaan taas uuden alkion lisääminen onnistumaan. Kaikki tämä logiikka voidaan tehdä pushoperaatiossa, jolloin käyttäjän ei tarvitse huolehtia siitä. Käyttäjän kannalta uusi piirre näkyy vain siinä, että push-operaatio onnistuu aina, koska tila ei lopu kesken. Perusideana on silloin,

5 5 että jos push-operaatiossa todetaan, että taulukossa ei ole enää tilaa uudelle alkiolle, tehdään seuraavat asiat: 1. Varataan uusi suurempi taulukko 2. Siirretään tiedot vanhasta taulukosta uuteen 3. Vapautetaan vanha taulukko 4. Päivitetään pinotietueen kentät siten, että ne vastaavat uutta tilannetta Dynaamista taulukkoa käytettäessä pinon rakenne näyttää seuraavalta: Tstack array top size Tämä vastaa taulukkototeutusta 1 dynaamisella taulukolla. Voitaisiin myös nyt käyttää vain osoittimia taulukkoon alkioita vietäessä ja sieltä haettaessa, jolloin saataisiin dynaamisella taulukolla toteutettu vastine taulukkototeutukselle 2. Molemmissa näissä ratkaisumalleissa siis alkioiden määrällä ei ole periaatteessa ylärajaa, koska dynaamisesta muistista voidaan varata suurempi taulukko aina tarvittaessa niin kauan kuin koneessa riittää muistia. Hintana sille, että alkioiden määrälle ei ole ylärajaa on se, että tietoja joudutaan siirtämään paikasta toiseen tilan kasvatuksen yhteydessä.. Tämän takia kannattaakin yleensä tilan lisäyksen yhteydessä varata sitä, enemmän kuin yhdelle alkiolle kerrallaan. Myöhemmin palaamme vielä yhteen ratkaisumalliin, jossa tästä tietojen siirtohinnasta päästään eroon. Sellainen ratkaisu saadaan aikaan käyttämällä dynaamisesti linkattua dynaamisesti varattu listaa tallennusrakenteena. Jono Määritelmä. Jono on järjestettyjen alkioiden kokoelma, jossa lisäykset tapahtuvat aina loppuun ja jossa alkio voidaan ottaa vain listan alusta. Lisäksi jonossa alkioiden järjestyksen määrää syöttöjärjestys. Jonon operaatiot ovat: initialize (alustaa jonon) enqueue (vie alkion jonon loppuun) dequeue (ottaa alkion jonon alusta) is_empty (testaa, onko jono tyhjä) Jonon sovelluksia. Myös jonoa voidaan käyttää monien erilaisten probleemoiden ratkaisuissa. Jono on tietoalkioiden säiliö, josta tiedot saadaan ulos siinä järjestyksessä kuin ne on sinne viety. Jono siis ikään kuin säilyttää alkioiden järjestyksen. Voidaan myös sanoa, että jonoon ensiksi viety alkio saadaan ulos ensimmäisenä. Siksi jono kutsutaan myös

6 6 FIFOksi (First In First Out: FIFO). Yhtä hyvin voidaan sanoa, että jonoon viimeksi viety alkio saadaan jonosta viimeisenä (LILO Last In Last Out). Yksinkertaisimmillaan jonoa voidaan käyttää tiedon säilyttämiseen siten, että ne pääsevät myöhemmin käsittelyyn siinä järjestyksessä kun ovat tulleet sisään. Pinon sovelluksena mainittiin, että palindromi-probleema voidaan ratkaista käyttämällä kolme pinoa. Palindromi-probleema voidaan ratkaista kätevästi myös käyttämällä yhtä pinoa ja yhtä jonoa. Tutkittavan merkkijonon merkit viedään pinoon ja jonoon. Sitten ruvetaan ottamaan merkkejä rinnakkain molemmista. Jos molemmista tulee loppuun saakka samoja merkkejä, alkuperäinen merkkijono on palindromi, koska pinosta merkit tulevat käänteisessä järjestyksessä ja jonosta alkuperäisessä järjestyksessä Abstraktia tietotyyppiä jono voidaan käyttää myös erilaisten odotusjonojen simulointiohjelmissa (esimerkiksi pankin palvelupisteiden odotusjonojen simulointi). Usean käyttäjän tietokoneiden käyttöjärjestelmissä käytetään jonoja kaikille yhteisten palvelujen tarjoamisessa (tulostusjonot, suoritusvuoroa odottavat taskit, i/o-pyynnöt levylle jne.). Myös puskureiksi kutsutut tietorakenteet ovat oikeastaan jonoja. Esimerkiksi BIOSnäppäimistöpuskuri on selkeästi jonorakenne, joka on toteutettu samantapaisella periaatteella kuin seuraavassa kuvattava jonon taulukkototeutus. Jonon taulukkototeutus 1: Taulukkototeutus sopii melko hyvin myös jonolle, koska siinäkin lisäykset tehdään aina listan loppuun. Se, että ottaminen tapahtuu aina listan alusta, johtaa kyllä tietojen siirtotarpeeseen, jos halutaan, että jonon ensimmäinen alkio on aina taulukon ensimmäisessä alkiossa. Tällöin jonoon jäljelle jääviä tietoja joudutaan siirtämään aina askel eteenpäin taulukossa. Tämä on kylläkin havainnollista, koska se vastaa esimerkiksi oikeaa henkilöiden jonoa, jossa ihmiset siirtyvät askeleen eteenpäin, kun yhtä asiakasta on palveltu jonon alusta. Yksinkertaisimmillaan tällainen ratkaisu saadaan aikaan määrittelemällä tietotyyppi Tqueue seuraavalla tavalla #define SIZE 100 typedef struct { Titem array[size]; int n; // alkioiden määrä jonossa }; Tästä voitaisiin kehittää dynaamista taulukkoa käyttävä versio, jossa alkioiden lukumäärällä ei olisi ylärajaa. Silloin tietueen määritelmä olisi kuten alla: typedef struct { Titem *array;; int n; // alkioiden määrä jonossa int size; // taulukon tämänhetkinen koko }; Tässä versiossa tietoa siirrettäisiin paikasta toiseen, jokaisessa otto-operaatiossa ja silloin kun tilaa kasvatettaisiin. Jonon taulukkototeutus 2: Yllämainituissa toteutuksissa tietoa siis siirretään aina jonosta otettaessa. Tästä päästään eroon, kun sallitaan, että jonon alku voi olla missä kohtaa taulukkoa tahansa, ja että jono voi jatkua taulukon lopusta taulukon alkuun. Tällaista jonon toteutusta sanotaan renkaaksi. Siinä pidetään kirjaa missä kohtaa taulukossa on jonon alku ja

7 7 missä kohtaa loppu. Ratkaisu yksinkertaistuu, jos pidetään erikseen kirjaa myös jonossa kulloinkin olevien alkioiden määrästä. Liitteenä on C-kielinen toteutus jonosta. Siinä pääohjelma, jolla jonoa voidaan testata, on samantapainen kuin pinon testausohjelma. Se siis lukee näppäimistöltä merkin. Jos merkki on kirjain, ohjelma vie merkin jonoon. Jos syötetty merkki on 1, niin ohjelma ottaa merkin jonosta ja tulostaa sen näyttöön. Testauksen ja kokeilun selkiyttämiseksi myös jonolle on tehty ylimääräinen operaatio print, joka tulostaa ruutuun koko jonon sisällön. Taulukkototeutuksen ideana on se, että jonoon vietävät alkiot talletetaan taulukkoon. Jonon tietokenttä last ilmoittaa aina sen paikan taulukossa, jossa sijaitsee viimeksi jonoon viety alkio. Arvo -1 merkitsee tyhjää jonoa. Tietokenttä first ilmoittaa jonon ensimmäisen alkion paikan taulukossa. Jonoon viemisen yhteydessä viedään aina kentän last ilmoittamaa paikkaa seuraavaan paikkaan. Jonosta otettaessa otetaan aina kentän first ilmoittamasta paikasta. Mikäli first tai last arvoa kasvatettaessa joudutaan taulukon ulkopuolelle, arvo asetetaan taulukon alkuun. Kenttä number_of_items ilmoittaa jonossa olevien alkioiden lukumäärän. Tqueue array first last number_of_items Myös tästä versiosta voidaan tehdä toteutus dynaamisella taulukolla, jossa siis ei ole ylärajaa alkioiden ylärajalle ja jossa tietoa ei siirretä otettaessa. Tietoa on kuitenkin edelleen siirrettävä taulukon tilaa kasvatettaessa. Myös jonosta tullaa vielä näkemään uusi versio, jossa tästäkin siirrosta päästään eroon dynaamisesti linkatulla aja varatulla listatoteutuksella. Abstrakti tietotyyppi toisen komponenttina Uusia abstrakteja tietotyyppejä voidaan rakentaa käyttäen hyväksi jo olemassa olevia tietotyyppejä. Esimerkkinä käsitellään prioriteettijono. Prioriteettijono on jono, jossa alkioihin liittyy prioriteetti. Kun alkio viedään jonoon, se viedään jonon loppuun, jos jonossa olevilla alkioilla on kaikilla sama tai korkeampi prioriteetti kuin uudella alkiolla. Uusi alkio viedään jonon alkuun, jos jonossa ei ole yhtään alkiota, jolla on korkeampi tai sama prioriteetti. Sääntönä on, että uusi alkio ohittaa jonossa kaikki sellaiset alkiot, joilla on matalampi prioriteetti kuin uudella. Prioriteettijono voidaan toteuttaa usealla eri tavalla. Tässä käsitellään toteutusta, jossa prioriteettijono rakennetaan erillisistä tavallista jonoista.

8 8 Esimerkissä prioriteetteja voi olla kolme (1, 2 ja 3). Toteutuksen ohjelmalistaus on liitteenä. Siinä käytetyn tietotyypin Tpriqueue rakenne selviää seuraavista määrittelyistä. typedef struct { Tqueue queue1; Tqueue queue2; Tqueue queue3; } Tpriqueue;

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

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

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

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

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

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Elegantti toteutus funktiolle insert_to_list_end Alkion lisäys sisällön mukaan järjestettyyn listaan (insert_to_list) Linkatun listan yleisyys alkiotyypin suhteen source-tasolla

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

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

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Muuttujat eri muisteissa Ohjelman muistialueen layout Paikallisen ja globaalin muuttujan ominaisuudet Dynaamisen muistinkäytön edut Paikallisten muuttujien dynaamisuus ADT

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

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Kurssin sisältö pääpiirteittäin Tarvittavat pohjatiedot Avainsanat Abstraktio Esimerkkiohjelman tehtäväkuvaus Abstraktion käyttö tehtävässä Abstrakti tietotyyppi Hyötyjä ADT:n

Lisätiedot

Algoritmit ja tietorakenteet / HL 1 Copyright Hannu Laine. Lista. Yleistä

Algoritmit ja tietorakenteet / HL 1 Copyright Hannu Laine. Lista. Yleistä Algoritmit ja tietorakenteet / HL 1 Lista Yleistä Lista, pino ja jono ovat abstrakteja tietotyyppejä, joilla on yleistä käyttöä. Niitä voidaan hyödyntää mitä erilaisimmissa probleemoissa ja sovelluksissa.

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

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

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

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

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

Lisätiedot

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

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

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

Algoritmit 1. Demot Timo Männikkö

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

Lisätiedot

Tietorakenteet ja algoritmit 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

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

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi ero taulukkoon taulukossa alkiot samantyyppisiä tietueessa alkiot voivat olla erityyppisiä tiedot kuitenkin yhteen kuuluvia ohjelmoinnin perusteet,

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

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

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

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

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

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

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

Dynaamiset tietorakenteet

Dynaamiset tietorakenteet 1 Dynaamiset tietorakenteet Muuttujien sijaintipaikat ja muut ominaisuudet Kuten tiedetään, muuttujan määrittely tarkoittaa tilan varausta muuttujalle. Tämä tila voidaan varata eri paikoista. Periaatteessa

Lisätiedot

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Luento 4 (verkkoluento 4) Aliohjelmien toteutus Luento 4 (verkkoluento 4) Aliohjelmien toteutus Tyypit, Parametrit Aktivointitietue (AT) AT-pino, rekursio 1 Aliohjelmatyypit Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri Parametrit

Lisätiedot

Muita linkattuja rakenteita

Muita linkattuja rakenteita 1 Muita linkattuja rakenteita Johdanto Aikaisemmin on käsitelty listan, jonon ja pinon toteutus dynaamisesti linkattuna rakenteena. Dynaamisella linkkauksella voidaan toteuttaa mitä moninaisimpia rakenteita.

Lisätiedot

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Luento 4 (verkkoluento 4) Aliohjelmien toteutus Luento 4 (verkkoluento 4) Aliohjelmien toteutus Tyypit, Parametrit Aktivaatiotietue (AT) AT-pino, rekursio 1 Aliohjelmatyypit Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri Parametrit

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

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille: Merkkijonot C-kielessä merkkijono on taulukko, jonka alkiot ovat char -tyyppiä. Taulukon viimeiseksi merkiksi tulee merkki '\0', joka ilmaisee merkkijonon loppumisen. Merkkijono määritellään kuten muutkin

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

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti linkattu taulukko Listan toteutuksen yleisyysvaatimukset Millä ehdoilla

Lisätiedot

3. Muuttujat ja operaatiot 3.1

3. Muuttujat ja operaatiot 3.1 3. Muuttujat ja operaatiot 3.1 Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit.

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

Jakso 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

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

Lisätiedot

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

Lisää pysähtymisaiheisia ongelmia

Lisää pysähtymisaiheisia ongelmia Lisää pysähtymisaiheisia ongelmia Lause: Pysähtymättömyysongelma H missä H = { w111x w validi koodi, M w ei pysähdy syötteellä x } ei ole rekursiivisesti lueteltava. Todistus: Pysähtymisongelman komplementti

Lisätiedot

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100 Tiedonsiirtokäskyt LOAD LOAD-käsky toimii jälkimmäisestä operandista ensimmäiseen. Ensimmäisen operandin pitää olla rekisteri, toinen voi olla rekisteri, vakio tai muistiosoite (myös muuttujat ovat muistiosoitteita).

Lisätiedot

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit. 3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen

Lisätiedot

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta. Tehtävä 63. Kirjoita oma versio funktiosta strcmp(),joka saa parametrinaan kaksi merkkiosoitinta. Tee ohjelma, jossa luetaan kaksi merkkijonoa, joita sitten verrataan ko. funktiolla. Tehtävä 64. Kirjoita

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ältö. 2. Taulukot. Yleistä. Yleistä

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

Lisätiedot

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Abstraktit tietotyypit TIEA341 Funktio ohjelmointi 1 Syksy 2005 Data abstraktio Abstraktio on ohjelmoinnin tärkein väline Data abstraktio abstrahoi dataa Abstrakti tietotyyppi Koostuu kolmesta asiasta:

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

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

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

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

Jakso 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot

Luento 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus Luento 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot

Luku 3. Listankäsittelyä. 3.1 Listat

Luku 3. Listankäsittelyä. 3.1 Listat Luku 3 Listankäsittelyä Funktio-ohjelmoinnin tärkein yksittäinen tietorakenne on lista. Listankäsittely on paitsi käytännöllisesti oleellinen aihe, se myös valaisee funktio-ohjelmoinnin ideaa. 3.1 Listat

Lisätiedot

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa ssa ohjelman käytössä suoritusaikana oleva muisti jakautuu neljään osaan: koodisegmentti datasegmentti pinosegmentti (stack) kasa (heap) ssa ohjelman koodisegmentti sisältää käännetyn ohjelmakoodin sisältö

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset

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

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 17.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 17.2.2010 1 / 41 Sanakirja Monissa sovelluksissa on tallennettava rakenteeseen avain arvo-pareja. Myöhemmin rakenteesta

Lisätiedot

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

Lisätiedot

Monipuolinen esimerkki

Monipuolinen esimerkki Monipuolinen esimerkki Lopuksi monipuolinen esimerkki, jossa ohjelmisto koostuu pääohjelmasta ja kahdesta aliohjelmasta, joista toinen on proseduuri ja toinen funktio. Funktio Sqrt(int n): int Sqrt(int

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla

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

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...

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

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa Tietojen tallennusrakenteet Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa tiedot tiedostoon kuuluvista lohkoista esim. taulukkona, joka voi muodostua ketjutetuista

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 16.3.2009 1 / 40 Kertausta: tiedostosta lukeminen Aluksi käsiteltävä tiedosto pitää avata: tiedostomuuttuja = open("teksti.txt","r")

Lisätiedot

Ohjelmointi 1 Taulukot ja merkkijonot

Ohjelmointi 1 Taulukot ja merkkijonot Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko

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

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

Uolevin reitti. Kuvaus. Syöte (stdin) Tuloste (stdout) Esimerkki 1. Esimerkki 2

Uolevin reitti. Kuvaus. Syöte (stdin) Tuloste (stdout) Esimerkki 1. Esimerkki 2 Uolevin reitti Kuvaus Uolevi on ruudukon vasemmassa ylänurkassa ja haluaisi päästä oikeaan alanurkkaan. Uolevi voi liikkua joka askeleella ruudun verran vasemmalle, oikealle, ylöspäin tai alaspäin. Lisäksi

Lisätiedot

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double

Lisätiedot

Ohjelmoinnin perusteet Y Python

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

Lisätiedot

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

Ohjelmoinnin peruskurssi Y1

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

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

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö Algoritmit 2 Luento 6 Ke 29.3.2017 Timo Männikkö Luento 6 B-puun operaatiot B-puun muunnelmia Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2017 Luento 6 Ke 29.3.2017 2/31 B-puu

Lisätiedot

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

OHJE KILPIEN LISÄÄMISESTÄ ATJN KILPIVARASTOON

OHJE KILPIEN LISÄÄMISESTÄ ATJN KILPIVARASTOON OHJE KILPIEN LISÄÄMISESTÄ ATJN KILPIVARASTOON Kilpiä voidaan joutua lisäämään kilpivarastotiedoksi mm. alla mainituissa tilanteissa. Sarjakilpivarastoon: - Tunnus on määräytynyt ajoneuvolle LTJn aikaisessa

Lisätiedot

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

Ohjelmoinnin perusteet Y Python

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

Lisätiedot

Tietotekniikan valintakoe

Tietotekniikan valintakoe Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan

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

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2 TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos TKT-3200 Tietokonetekniikka I Harjoitustyö 4: Cache, osa 2.. 2010 Ryhmä Nimi Op.num. 1 Valmistautuminen Cache-työn toisessa osassa

Lisätiedot

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Toinen harjoitustyö. ASCII-grafiikkaa 2017 Toinen harjoitustyö ASCII-grafiikkaa 2017 Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt17-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin

Lisätiedot