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.

Slides:



Advertisements
Samankaltaiset esitykset
18. Abstraktit tietotyypit
Advertisements

Copyright  Hannu Laine Bittitason-operaatiot Hannu Laine.
Tietorakenteet ja algoritmit
15. Loogiset operaatiot.
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
© 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
2.8.3 Abstraktit tietotyypit
Rakenteinen ohjelmointi
Yhteystila-algoritmi
Taulukot Jukka Juslin © Jukka Juslin 2006.
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
Taulukoiden määrittely, käsittely ja kopiointi Vaihtoehdot taulukoille
Copyright  Hannu Laine Osoittimet ja taulukot Hannu Laine.
C-kieli ja dynaaminen muistin varaus
22. Taulukot.
Rakenteinen ohjelmointi
Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely •Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän.
10/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti.
Näytölle tulostaminen. 7.2 Sisällys System.out.println - ja System.out.print -operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden.
Sovellusohjelman suunnittelu & toteutus
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.
TyyppimuunnoksettMyn1 Tyyppimuunnokset Joskus kääntäjän on tehtävä itse päätöksiä, jos ohjelmoija ei ole ajatellut yksityiskohtia: int arvo1=10; long arvo2=25;
Ohjelmoinnin tekniikkaa Sisällys for -lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely.
TAULUKKO YKSIULOTTEINEN TAULUKKO. TAULUKKO  Taulukon tarkoitus Ohjelmassa tarvitaan paljon samantyyppisiä samaan kohdealueeseen kuuluvia muuttujia Näitä.
Osoitin ja char- tietotyyppi tMyn1 Osoitin ja char-tietotyyppi Osoitinmuuttuja, joka on tyyppiä char* voidaan alustaa merkkijonolla: char* alku=”En toivo.
Sami Jantunen LTY/Tietotekniikan osasto
Dynaamiset oliottMyn1 Dynaamiset oliot Dynaamisen olion tunnuksen esittely ja olion määrittely voivat tapahtua yhtäaikaisesti tai eri aikaan. Dynaamisen.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
Virtuaaliset jäsenfunktiot tMyn1 Virtuaaliset jäsenfunktiot Virtuaalinen jäsenfunktio on esiteltävä monimuotoisessa kantaluokassa. Virtuaalisen jäsenfunktion.
Funktion esittely eli prototyyppi tMyn1 Funktion esittely eli prototyyppi Funktion esittely (function declaration) kertoo funktion nimen, parametrien tyypit.
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
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
Muuttujat ja vakiottMyn1 Muuttujat ja vakiot PHP-kielen syntaksi on lainattu suurimmaksi osaksi C- kielestä. PHP on erityisesti HTML-dokumenttien sisään.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Ohjelman keskeytys virhetilanteessa tMyn1 Ohjelman keskeytys virhetilanteessa Poikkeustilanteet voidaan ryhmitellä logiikkavirheisiin ja muihin ajonaikaisiin.
22. Taulukot.
@ Leena Lahtinen TIETOKONEOHJELMAN RAKENNE OHJELMALLA ON KAKSI OSAA:  MÄÄRITYSOSA TIETOJEN KUVAUKSIA VARTEN  SUORITUSOSA TIETOJEN KÄSITTELYÄ.
© 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)
Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
Kontrollirakenteet laajemmin
Monimuotoinen luokka tMyn1 Monimuotoinen luokka Monimuotoinen luokka mahdollistaa saman jäsenfunktion toteutuksen monella tavalla. Tällöin puhutaan virtuaalisesta.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
To start press the space bar. Tietojen päivittäminen PAF kantaan käyttäen Temple Ready ohjelmaa ja IGI CD- levyjä CD-ROM:lla on tiedot vuoteen 2000 saakka,
Java - Tietokanta. JDBC=Java database connectivity  ODBC:n kaltainen ohjelmointiliittymä SQL- tietokantoihin  Koostuu Java-kehitysympäristön (esim.
Ict02d Johdanto Dynaamiset tietorakenteet –Rakenteiden tilavaraus laajenee/pienenee ajonaikaisesti. –Rakenteita on useita tyyppejä Linkitetty lista Pino.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
Foreach-toistolausetMyn1 foreach-toistolause foreach-rakenteella on kätevä käydä läpi kaikki taulukon alkiot. Erityisen kätevää se on hajautustaulukon.
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)
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); /*
Linkitetty lista Joukko alkioita jotka on kytketty toisiinsa linkeillä Listan alkio sisältää talletettavan datan ja linkin seuraavan alkioon Alkion lisääminen.
Symbolitaulut Joukko hakuavaimen omaavia tietueita LISÄÄ uusi tietue ETSI tietue hakuavaimen perusteella Sovelluksia: Spell checker etsii sanoja sanakirjasta.
Abstraktit tietotyypit – jatkoa TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
Abstraktit tietotyypit TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
13. Loogiset operaatiot.
13. Loogiset operaatiot.
4. Luokan testaus ja käyttö olion kautta
Esityksen transkriptio:

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 (insert_to_list) Linkatun listan yleisyys alkiotyypin suhteen source-tasolla Linkatun listan yleisyys alkiotyypin suhteen konekielitasolla Pinon toteutus linkattuna rakenteena Jonon toteutus linkattuna rakenteena Muita linkattuja rakenteita

11/9/2012 © Hannu Laine 2 ”Elegantti” toteutus funktiolle insert_to_list_end /* The most efficient and simple iterative solution. There is no special treatment for the first element */ void insert_to_list_end_3(Tlist *list, Titem data) { Tpointer new_node, *aux; new_node = (Tpointer) malloc(sizeof(Tnode)); new_node->item = data; new_node->next = NULL; aux = list; while (*aux) aux = &((*aux)->next); *aux = new_node; } Tässä listaa edustaa edelleen yksi osoitin.

11/9/2012 © Hannu Laine 3 How to insert an item into an ordered linked list // Määrittelyt typedef char Titem; typedef struct node *Tpointer; typedef struct node { Titem item; Tpointer next; } Tnode; typedef Tpointer TorderedList; // Initialisointi void initialize (TorderedList *plist) { *plist = NULL; } // Iteratiivinen versio 1 void insert_to_list(TorderedList *plist, Titem data) { Tpointer new_node, pointer; new_node = (Tpointer) malloc(sizeof(Tnode)); new_node->item = data; if (*plist == NULL || data item ) { new_node -> next = *plist; *plist = new_node; } else { pointer = *plist; while( pointer->next != NULL && data > pointer->next-> item ) pointer = pointer ->next; // pointer osoittaa nyt uutta edeltävää nodea new_node->next = pointer->next; pointer->next = new_node; } // Iteratiivinen versio 2 void insert_to_list(TorderedList *plist, Titem data) { Tpointer new_node; Tpointer *pointer; new_node = (Tpointer) malloc(sizeof(Tnode)); new_node->item = data; pointer = plist; while( *pointer != NULL && data > (*pointer)-> item ) pointer = &((*pointer) ->next); new_node->next = *pointer; *pointer = new_node; }

11/9/2012 © Hannu Laine 4 Linkatun listan source-tason yleisyys 1 Kaikki toteutetut listan funktiot ovat riippumattomia alkiotyypistä source- kooditasolla (poikkeuksena print_list funktio, katso seuraava sivu). Esimerkki. Merkkien sijasta pitäisi listata henkilöitä. Henkilötietoja ovat nimi, ikä ja paino. Määritellään henkilötiedot sisältävä tietue Thlo kuten aikaisemmin: typedef struct { char nimi[31]; int ika; float paino; } Thlo; Jos nyt määritellään typedef Thlo Titem; Niin kaikki listan toteutuksen kohdat pysyvät identtisinä (solmun ja listan tietomäärittelyt sekä funktioiden toteutukset).

11/9/2012 © Hannu Laine 5 Linkatun listan source-tason yleisyys 2 Poikkeuksena on siis print_list funktio, jossa on vikana se, että yksittäistä alkiota käsiteltäessä on käytetty hyväksi tietoa sen sisäisestä esityksestä. Tämä yleisyyden ”pilaaminen” olisi voitu estää pitämällä myös alkiota ADT:na ja tulostamalla se operaatiofunktiolla print_item (printf, scanf, vertailut ja sijoitus ongelmallisia). Edellä kuvattu toteutuksen yleisyys alkiotyypin suhteen tarkoittaa sitä, että toteutus on source-kooditasolla riippumaton alkiotyypistä. Uusi lista saadaan määrittelemällä uusi alkiotyyppi ja kääntämällä listan toteutus uudelleen. Jos samassa ohjelmassa tarvitaan kahta listaa eri alkiotyypeille, tarvitaan listan operaatiofunktioista kaksi kopiota, joissa erona on vain funktionimet ja tyyppinimet parametrilistassa (C++:ssa riittää eroksi funktioiden ylikuormituksen takia vain erot tyyppinimissä).

11/9/2012 © Hannu Laine 6 Linkatun listan source-tason yleisyys 3 Esimerkki. // Merkkien lista typedef struct char_node { char item;//merkkien lista struct char_node *next; } Tchar_node; typedef Tchar_node *Tchar_node_pointer; typedef struct { Tchar_node_pointer first; Tchar_node_pointer last; } Tchar_list; // Henkilöiden lista // Muutokset sinisiin kursiivikohtiin

11/9/2012 © Hannu Laine 7 Linkatun listan source-tason yleisyys 4 Tämän jälkeen tarvitaan uudet kopiot funktioista, joissa siis vain nimimuutoksia. Kaikki muutokset ovat ”koneellisia” ja ne voidaan tehdä seuraavilla tavoilla: 1) Copy/Paste ja Search/Replace toiminnalla 2) Tekemällä makro, joka generoi toteutuksen uudelle listalle 3) Tekemällä kaikki operaatiofunktiot template funktioiksi, jolloin kääntäjä generoi funktiototeutukset automaattisesti (C++). 4) Määrittelemällä koko lista ns. template-luokaksi, jolloin kääntäjä generoi automaattisesti myös tietomäärittelyt (C++). Huomautus. Tämä on sama asia, joka käytiin läpi taulukolla toteutetun listan yhteydessä.

11/9/2012 © Hannu Laine 8 Linkatun listan binääritason yleisyys 1 Toinen tapa toteuttaa yleisyyttä on säilöä itse tiedon sijasta tiedon osoittimia. Silloin linkatun listan solmuun tallennettavan tiedon tyyppi on void*. Tällaisen toteutuksen etuna on, että sama ja yksi objektikoodi listan toteutuksesta riittää. Haittana on, että sovelluksessa pitää erikseen huolehtia säilöttävästä tiedosta, koska se ei tallennu säiliöön. Esimerkki seuraavalla sivulla.

11/9/2012 © Hannu Laine 9 Linkatun listan binääritason yleisyys 2 Esimerkki. typedef void *Titem; //Titem on nyt geneerinen osoitin //Listan interface typedef struct node *Tpointer; typedef struct node { Titem item; Tpointer next; } Tnode; typedef struct { Tpointer first; Tpointer last; } Tlist; void initialize_list (Tlist *list); void insert_to_list_end(Tlist *list, Titem data); void print_list (Tlist list); void cleanup_list(Tlist *list); Tämä on nyt ainoa muutos joka tarvitaan osassa 9 esitettyyn listan toteutukseen!! Näiden funktioiden toteutuksetkaan osan 9 sivuilla 11 – 12 eivät muutu!! (Vain se print_list oli ongelma.)

11/9/2012 © Hannu Laine 10 Linkatun listan binääritason yleisyys 3 Esimerkki edellisellä sivulla olevan listan käytöstä: int main (void) { Tlist hloList, charList; Thlo hlo; // handle Tchar chr; // handle initialize_list(&hloList); initialize_list(&charList); hlo = CreateHlo(”Matti”, 23, 62.0); chr = CreateChar(’a’); insert_to_list_end(&hloList, hlo); insert_to_list_end(&charList, chr); hlo = CreateHlo(”Maija”, 22, 51.0); chr = CreateChar(’b’); insert_to_list_end(&hloList, hlo); insert_to_list_end(&charList, chr); } C-kääntäjä tekee tyyppimuunnokset (void*)hlo (void*)chr Huomautus. Esimerkkiin on yhdistetty myös handle ajattelu. Tilanne merkkilistan osalta muistissa on seuraava: a b

11/9/2012 © Hannu Laine 11 Linkatun rakenteen ja taulukon vertailu Ominaisuus Muistin varaus Linkattu lista Ei ylivuotoa. Kaikki koneen vapaa muisti on käytettävissä. Ei myös- kään siirtoja. Taulukko Muisti varattava kokonaan ennen kuin käyttö alkaa, jolloin muisti voi loppua kesken tai sitä on varattuna liikaa (tiedon siirto) Tiedon hakuVain peräkkäishaku mahdollista. Myös suorahaku on mahdollista, kun järjestysnumero tiedetään. Järjestyksen ilmaisutapa Järjestys osoitetaan linkeillä. Järjestys ilmaistaan sijainnilla muistissa. Operaatioiden vaatima prosessoriteho Lisäykset väliin ja poistot välistä ovat helppoja. Lisäyksissä ja poistoissa väliin tarvitaan tietojen siirtoa. OhjelmointiVaatii vähän harjoittelua.On helppoa.

11/9/2012 © Hannu Laine 12 Pinon toteutus dynaamisesti linkatulla listalla 1 Myös pino voidaan toteuttaa dynaamisesti linkatulla listalla. Etuna on, että tietojen siirtoa ei tarvita tilankasvatuksessa ja tilaa riittää. Toteutus saadaan tehokkaaksi kun linkatussa listassa alku ajatellaan pinon huipuksi. Silloin lisäys huipulle ja huipulta poisto saadaan molemmat tehokkaiksi ja pinon esittämiseen tarvitaan vain yksi osoitin. Solmun määrittelyt pidetään kuten ennen ja tyyppi Tstack määritellään seuraavasti: typedef Tpointer Tstack; void initialize_stack(Tstack* stack); void push((Tstack* stack, Titem item); Tboolean pop((Tstack* stack, Titem* item); Esimerkkitoteutukset funktioille initialize_stack ja push ovat seuraavalla sivulla.

11/9/2012 © Hannu Laine 13 Pinon toteutus dynaamisesti linkatulla listalla 2 void initialize_stack(Tstack* stack) { *stack = NULL); } void push(Tstack* stack, Titem data) { Tpointer newnode; newnode = (Tpointer) malloc(sizeof(Tnode)); newnode->item = data; newnode->next = *stack; *stack = newnode; } Huomautus 1. Sama funktio toimii myös vaikka pino olisi tyhjä. Huomautus 2. ”Täydellisessä” ratkaisussa olisi testi muistin varauksen onnistumisesta. Epäonnistumisen yhteydessä push palauttaisi siitä tiedon (esim NOT_OK). acb

11/9/2012 © Hannu Laine 14 Jonon toteutus dynaamisesti linkatulla listalla 1 Jonokin voidaan toteuttaa dynaamisesti linkatulla listalla. Etuna nytkin on, että tietojen siirtoa ei tarvita tilankasvatuksessa eikä muulloinkaan ja tilaa riittää. Toteutus saadaan tehokkaaksi, kun pidetään yllä ensimmäisen ja viimeisen solmun osoitetta. Silloin enqueue operaatio on kuten insert_to_list_end aikaisemmassa esimerkissämme. Operaatio dequeue taas on kuin operaatio pop pinolle sillä erotuksella, että ensimmäisen solmun osoite on tietueessa first kentässä. Solmun määrittelyt pidetään kuten ennen ja tyyppi Tqueue määritellään seuraavasti: typedef struct {Tpointer first; Tpointer last;} Tqueue; void initialize_queue(Tqueue* queue); void enqueue((Tqueue* queue, Titem item); Tboolean dequeue((Tqueue* queue, Titem* item); Esimerkkitoteutukset funktioille initialize_queue ja dequeue ovat seuraavalla sivulla.

11/9/2012 © Hannu Laine 15 Jonon toteutus dynaamisesti linkatulla listalla 2 void initialize_queue(Tqueue* queue) { queue->first = NULL; queue->last = NULL; } Tboolean dequeu(Tqueue* queue, Titem* data) { Tpointer aux; if (queue->first != NULL) { *data = queue->first->item; aux = queue->first; queue->first = aux -> next free aux; return OK; } return NOT_OK; } a b c