Tietorakenteet ja algoritmit

Slides:



Advertisements
Samankaltaiset esitykset
makramee-tekniikalla
Advertisements

18. Abstraktit tietotyypit
Copyright  Hannu Laine Bittitason-operaatiot Hannu Laine.
15. Loogiset operaatiot.
Yhtälön ratkaiseminen
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
Tietoturvallisuuden huonetaulu
© Hannu Laine 1 Tietorakenteet ja algoritmit Funktio-osoittimet Funktio-osoittimen ja taulukko-osoittimen vertailu Funktio-osoittimen käyttötapoja.
JavaScript (c) Irja & Reino Aarinen, 2007
Tietorakenteet ja algoritmit
11/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Elegantti toteutus funktiolle insert_to_list_end Alkion lisäys sisällön mukaan järjestettyyn listaan.
2.8.3 Abstraktit tietotyypit
Rakenteinen ohjelmointi
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
Copyright  Hannu Laine Osoittimet ja taulukot Hannu Laine.
22. Taulukot.
Rakenteinen ohjelmointi
10/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti.
Ohjelmointitaito (ict1td002, 12 op) Syksy 2008
Langattomien laitteiden matematiikka 1
Näytölle tulostaminen. 7.2 Sisällys System.out.println - ja System.out.print -operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden.
C-ohjelmointi, kevät 2006 Taulukot Binääritiedostot Luento
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
@ Leena Lahtinen Helia OHJELMOINTITAITO ICT02D 12 OP.
OHJELMOINTITAITO ICT02D 12 ECTS. OPINTOJAKSON TOTEUTUS  KESTO: –  PÄIVÄOPISKELIJAT: – KAKSI LUOKAA (SUOMI) –YKSI LUOKKA (ENGLANTI)
Elinkeinopoliittinen mittaristo 2014 Kemi 1. ELINKEINOPOLITIIKAN TILA 2.
KERTAUSTA PERUSASTEEN MATEMATIIKASTA Piia junes
Vakio-osoitin ja osoitin vakioon tMyn1 Vakio-osoitin ja osoitin vakioon Tavallinen osoitin voi vaihtaa osoitettavaa keskusmuistialuetta. Tämä voidaan tehdä.
Ohjelmoinnin tekniikkaa Sisällys for -lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely.
Binäärinen hakupuu Jokaisessa solmussa on yksikäsitteinen avain
Osoitin ja char- tietotyyppi tMyn1 Osoitin ja char-tietotyyppi Osoitinmuuttuja, joka on tyyppiä char* voidaan alustaa merkkijonolla: char* alku=”En toivo.
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
Tietovuokaaviot (ei osa UML-kieltä)
ict1td002 - Copyright Raine Kauppinen 1 Alkuarvot ja tyyppimuunnokset (1/5)  Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int.
String-vertailusta ja Scannerin käytöstä (1/2)
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
2.8 TIETO- JA TALLETUSRAKENTEET
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
22. Taulukot.
OHJELMOINTITAITO ICT02D 12 ECTS. OPINTOJAKSON TOTEUTUS  KESTO: –  AVOIMEN OPISKELIJAT: – YKSI LUOKA (SUOMI) – LUOKKA ICT02O-1.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen
© Jukka Juslin1 Osio2 Olio-ohjelmointi: Merkkijonot eli Stringit Jukka Juslin.
Rinnakkaisuus Järjestelmässä, jossa voi olla useita prosesseja rinnakkain suorituksessa voi tulla tilanteita, joissa prosessien suoritusta täytyy kontrolloida.
Johdatus ohjelmointiin – C kielen peruselementit Tutkijayliopettaja Manne Hannula Opetusharjoittelu (ohjaava opettaja Jukka Jauhiainen)
S ysteemianalyysin Laboratorio Teknillinen korkeakoulu Esitelmä 9 - Jaakko Niemi Optimointiopin seminaari - Syksy 2005 / 1 Virittäminen (Tuning) s
Visual Basic -ohjelmointi
Ohjelmointi työtä n. 16 h/vko onnistumista työtä n. 16 h/vko onnistumista #include int main(void) { std::cout
Osoittimen määrittely ja alustus tMyn1 Osoittimen määrittely ja alustus Osoitin (pointer) on muuttuja, joka voi sisältää keskusmuistiosoitteen. Osoitinmuuttujan.
Ohjausrakenteet Määräävät ohjelmakoodin suoritusjärjestyksen Ehtolause if – else on muotoa if (lauseke) lause1 else lause2 Jos lauseke on tosi, niin suoritetaan.
Prioriteettijonot ja kekolajittelu (heapsort)
Kuplalajittelu (bubble sort)
Lajittelun sovelluksia Yksilöllisyyden testaaminen Kopioiden poistaminen Mediaani/n:ksi suurimman valinta frekvenssien laskenta/yleisin alkio, l.moodi.
Muuttujan osoite int a=1; 0xbfffea64 /* tulostetaan a:n osoite*/ printf(“%p\n”, &a); 0xbfffea68 /* tulostetaan a:n osoite + 1*/ printf(“%p\n”, &a+1); /*
Usein aliohjelman kutsun tulos ei riipu pelkästään eksplisiittisistä syötteistä vaan myös moduulin tai olion tilasta (state). ● Tila määräytyy yleensä.
Symbolitaulut Joukko hakuavaimen omaavia tietueita LISÄÄ uusi tietue ETSI tietue hakuavaimen perusteella Sovelluksia: Spell checker etsii sanoja sanakirjasta.
Scalan valmiit kokoelmat. Mikä on kokoelma?  Tietorakenne jonka tehtävänä on pitää kirjaa (useista) tietyn tyyppisistä arvoista. Kokoelman sisältämiä.
Scala Collections.
4. Komentoriviparametrit
7. Hyvä ohjelmointitapa..
13. Loogiset operaatiot.
7. Näytölle tulostaminen
16. Ohjelmoinnin tekniikkaa
7. Hyvä ohjelmointitapa..
7. Näytölle tulostaminen
13. Loogiset operaatiot.
4. Luokan testaus ja käyttö olion kautta
Jakso 4 Aliohjelmien toteutus
16. Ohjelmoinnin tekniikkaa
Esityksen transkriptio:

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 Backtracking menetelmä Pinon toteutustapoja Taulukko indeksoinnilla Taulukko osoittimilla © Hannu Laine 11/9/2012

Pinon määritelmä (Stack) 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ä) Vastaavat funktioiden prototyypit voisivat olla void initialize_stack (Tstack *pstack); Tboolean push( Tstack *pstack, Titem item); Tboolean pop( Tstack *pstack, Titem *pitem); int is_empty(const Tstack* pstack); void print_stack (const Tstack *pstack); // apufunktio testaukseen © Hannu Laine 11/9/2012

Pinon sovelluksia Järjestyksen kääntäminen Palindromiprobleeman ratkaisu Laitteen purku ja kasaus Postfix-merkintäisen lausekkeen laskenta Infix-merkintäisen lausekkeen muunto postfix-merkintäiseksi Päällekkäisten menuikkunoiden toteutus käyttöliittymässä Sisäkkäiset funktiokutsut Sisäkkäiset keskeytyspalvelufunktiot Yksinkertainen rivieditori © Hannu Laine 11/9/2012

Esimerkki1. Merkkijonon merkkien järjestyksen kääntö #include ”stack.h” #include <string.h> void kaanna_jarjestys(char* mrk_jono) { Tstack merkkipino; int i, pit; initialize_stack(&merkkipino); for ( i = 0; i < strlen(mrk_jono), i++ push(&merkkipino, mrk_jono[i]); pop(&merkkipino, &mrk_jono[i]); } © Hannu Laine 11/9/2012

Esimerkki 2. Palindromiprobleema (periaate) #include ”stack.h” int onko_palindromi(const char* mrk_jono) { Tstack pino1, pino2, pino3; char mrk1, mrk2, mrk3; // initialisoi kaikki kolme pinoa // vie merkkijonon merkit pinoihin 1 ja 2 // siirrä merkit pinosta 2 pinoon 3 while(!is_empty(&pino2) { pop(&pino2, &mrk); push(&pino3, mrk); } // Otetaan tasatahtiin pinoista 1 ja 3 while(!is_empty(&pino1) { pop(&pino1, &mrk1); pop(&pino3, &mrk2); if(mrk1 != mrk2) return 0; return 1; © Hannu Laine 11/9/2012

Infix-merkintäisen lausekkeen laskenta Infix-merkintäisen lausekkeen laskenta koneellisesti ei ole helppo tehtävä. Tehtävän tekee ongelmalliseksi se, että operaatioita ei voi suorittaa sitä mukaa, kun ne tulevat vastaan. Asioita on pidettävä muistissa ja sitten operaatioita tehtävä niiden vahvuusjärjestyksessä. Ihmiselle tehtävä on melko helppo. Ihminen ”skannaa” lausekkeen läpi ja löytää helposti paikan, josta aloitetaan ja etenee oikeassa järjestyksessä havainnoiden koko ajan koko lauseketta. Esimerkiksi lauseketta 3 + 5 * 2 / 3 alusta tulkittaessa ei voida tehdä mitään operaatiota ennen kuin lausekkeessa on edetty viisi askelta! (3 operandia ja 2 operaattoria). Tehtävän koneellinen ratkaisu yksinkertaistuu oleellisesti, kun se jaetaan kahteen vaiheeseen: 1. infix-merkintäisen lausekkeeen muunto postfix-merkintäiseksi 2. postfix-merkintäisen lausekkeen laskenta Molemmissa vaiheissa tarvitaan pinoa muistivarastona! Tarkastellaan näitä vaiheita erikseen ja aloitetaan jälkimmäisestä © Hannu Laine 11/9/2012

Postfix-merkintäinen lauseke RPN-laskimissa käytetään tällaista laskentatapaa. RPN-lyhenne tulee sanoista Reverse Polish Notation (eli käänteinen puolalainen merkitsemistapa) Postfix merkintä tarkoittaa, että operaattori tulee perässä operandien jälkeen. Lausekkeen laskenta koneellisesti on yksinkertaista. Myös lausekkeen merkintä on yleensä lyhyempi, koska sulkeita ei tarvita laskentajärjestyksen määräämiseksi. On myös tällä periaatteella toimivia ohjelmointikieliä, esimerkiksi PostScript-kieli. Esimerkki lausekkeesta: 3 5 + 7 2 - * vastaa infix merkintäistä lauseketta (3 + 5) * (7 – 2) © Hannu Laine 11/9/2012

Postfix-merkintäisen lausekkeen laskenta Kuten edellisellä sivulla jo sanottiin, postfix-merkintäisen lausekkeen laskenta koneellisesti on helppoa. Lausekkeen laskenta perustuu operandien pinoon. Se on helppoa siksi, että lauseketta voidaan edetä vasemmalta oikealle ja päätös siitä mitä seuraavaksi tehdään, voidaan tehdä aina välittömästi. Käsittelysäännöt ovat tässä: Kun lausekkeesta löytyy operandi, se viedään aina pinoon Kun lausekkeesta löytyy operaattori, pinosta otetaan kaksi operandia ja niille tehdään operaattorin määräämä operaatio. Tulos viedään pinoon Lopuksi pinossa on vain yksi arvo, joka on lopputulos. Taululla käydään läpi kuinka esimerkiksi lauseke 3 5 + 7 2 - * lasketaan (vastaten lauseketta (3 + 5) * (7 – 2) ). © Hannu Laine 11/9/2012

Infix-merkintäisen lausekkeen muunto postfix-merkintäiseksi Myös infix-lausekkeen muuntaminen postfix-muotoon on koneellisesti helppoa, kun käytetään operaattorien pinoa. Nytkin lauseketta voidaan edetä vasemmalta oikealle ja päätös siitä mitä seuraavaksi tehdään, voidaan tehdä aina välittömästi. Käsittelysäännöt ovat: Kun infix-lausekkeesta löytyy operandi, se viedään suoraan postfix-lausekkeeseen. Kun infix-lausekkeesta löytyy operaattori, se viedään aina pinoon, mutta sitä ennen pinosta otetaan pois ja viedään postfix-lausekkeeseen kaikki operaattorit, joilla on korkeampi tai sama prioriteetti. Lopuksi pinosta viedään postfix-lausekkeeseen kaikki siellä olevat operaattorit. Taululla käydään läpi kuinka esimerkiksi lauseke (3 + 5) * (7 – 2) muunnetaan postfix-muotoon. © Hannu Laine 11/9/2012

Sisäkkäiset funktiokutsut Tietokoneessa käytetään pinomuistia (stack segment) funktioiden parametrien ja paikallisten muuttujien tallennuspaikkana. Se tekee mahdolliseksi sisäkkäiset funktiokutsut. Esimerkki int main(void) { int loc; f1(loc); … } void f1(int par1) { int loc1; f2(loc1); void f2(int par2) { int loc2; Stack segment loc par1 loc1 par2 loc2 f2 f1 main © Hannu Laine 11/9/2012

Yksinkertainen taulukkototeutus indeksoinnilla #define N 8 typedef ... Titem; typedef struct { Titem array[N]; int top; } Tstack; Täydellinen toteutus verkossa (Esimerkki 1, Moniste 4) Edut: Yksinkertainen Havainnollinen Tehokas Tstack 7 6 5 4 array 3 2 b 1 a top 1 © Hannu Laine 11/9/2012

Yksinkertainen taulukkototeutus osoittimilla #define N 8 typedef ... Titem; typedef struct { Titem array[N]; Titem* top; Titem* maxpointer; Titem* minpointer; } Tstack; Täydellinen toteutus verkossa (Esimerkki 3, Moniste 4) Edut: Yksinkertainen Havainnollinen Vielä tehokkaampi Tstack 1 2 3 4 5 6 7 array b a maxpointer top minpointer © Hannu Laine 11/9/2012

Yleisyys Palautetaan mieleen, että säiliön toteutus on riippumaton säilöttävän alkion tyypistä. Myös nähdyt pinon toteutukset ovat source-kooditasolla riippumattomia ”pinottavien” alkioiden tyypistä! © Hannu Laine 11/9/2012

Backtracking menetelmä Käytämme backtracking menetelmän esittelyssä esimerkkinä reitinhakuohjelmaa ”tieverkossa”. Alla on tieverkon kuvaus graafisesti ja taulukkoesityksenä. int graph[][2] ={ { 1,2},{1,3},{1,4}, {2,5},{2,6}, {3,7}, {4,8}, {4, 9}, {5,-1}, {6,10},{6,11}, {7,12},{7,13}, {8,-1}, {9,14},{9,15},{9,16}, {10,-1}, {11,17},{11,18}, {12,-1}, {13,-1}, {14,19},{14,20}, {15,21}, {16,-1}, {17,-1},{18,-1},{19,-1},{20,-1},{21,-1} }; 1 2 3 5 6 10 11 17 13 7 12 18 4 14 9 15 16 21 19 20 8 Ohjelma, joka etsii reitin annetusta solmupisteestä toiseen annettuun solmupisteeseen löytyy verkosta. © Hannu Laine 11/9/2012