Tietorakenteet ja algoritmit

Samankaltaiset tiedostot
Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

TIETORAKENTEET JA ALGORITMIT

Tietorakenteet ja algoritmit

Muita linkattuja rakenteita

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

Tietorakenteet ja algoritmit

A TIETORAKENTEET JA ALGORITMIT

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

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

Dynaamiset tietorakenteet

Algoritmit 1. Luento 4 Ke Timo Männikkö

Rakenteiset tietotyypit Moniulotteiset taulukot

Tietorakenteet ja algoritmit

Algoritmit ja tietorakenteet / HL Copyright Hannu Laine

2. Perustietorakenteet

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

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

18. Abstraktit tietotyypit 18.1

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Algoritmit 2. Luento 2 To Timo Männikkö

3. Binääripuu, Java-toteutus

Osoittimet ja taulukot

Lyhyt kertaus osoittimista

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

Tietueet. Tietueiden määrittely

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

Algoritmit 1. Luento 5 Ti Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Tietorakenteet ja algoritmit

Tieto- ja tallennusrakenteet

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Olio-ohjelmointi Syntaksikokoelma

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Algoritmit 1. Demot Timo Männikkö

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

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

Algoritmit 1. Luento 3 Ti Timo Männikkö

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

Jakso 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Dynaaminen muisti Rakenteiset tietotyypit

Loppukurssin järjestelyt

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

Algoritmit 1. Luento 14 Ke Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 1. Luento 1 Ti Timo Männikkö

Tietorakenteet, laskuharjoitus 3, ratkaisuja

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmoinnin perusteet Y Python

Loppukurssin järjestelyt C:n edistyneet piirteet

Tietorakenteet ja algoritmit

Algoritmit 2. Luento 4 Ke Timo Männikkö

Jakso 4 Aliohjelmien toteutus

Tietorakenteita 163. Yhteen suuntaan linkitetyn listan rakenne on siis seuraavan kuvan kaltainen:

Tietorakenteet ja algoritmit - syksy

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Sisältö. 2. Taulukot. Yleistä. Yleistä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

C++11 lambdat: [](){} Matti Rintala

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

Ohjelmoinnin perusteet Y Python

C++11 seminaari, kevät Johannes Koskinen

struct info { typedef struct InfoT { char firstname[20]; char firstname[20]; char lastname[20]; char lastname[20]; int age; int age;

Algoritmit 1. Luento 9 Ti Timo Männikkö

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

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

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Osoittimet ja taulukot

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

Algoritmit ja tietorakenteet Copyright Hannu Laine. 1, kun n= 0. n*(n-1)!, kun n>0;

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

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

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Ohjelmistotuotanto, kurssikoe , H. Laine Arvostelu

Jakso 4 Aliohjelmien toteutus

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

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

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

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 Taulukot ja merkkijonot

815338A Ohjelmointikielten periaatteet

Algoritmit 2. Luento 3 Ti Timo Männikkö

Ohjelmoinnin peruskurssien laaja oppimäärä

Algoritmi ja abstraktio

Transkriptio:

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 1

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

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 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; // 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 < (*plist)-> 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; 3

Linkatun listan source-tason yleisyys 1 Kaikki toteutetut listan funktiot ovat riippumattomia alkiotyypistä sourcekooditasolla (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). 4

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ä). 5

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 6

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

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

Linkatun listan binääritason yleisyys 2 Esimerkki. typedef void *Titem; //Titem on nyt geneerinen osoitin //Listan interface typedef struct node *Tpointer; typedef struct node { Tämä on nyt ainoa 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); 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.) 9

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 Tilanne merkkilistan osalta muistissa on seuraava: a b Huomautus. Esimerkkiin on yhdistetty myös handle ajattelu. 10

Linkatun rakenteen ja taulukon vertailu Ominaisuus Muistin varaus Tiedon haku Järjestyksen ilmaisutapa Linkattu lista Ei ylivuotoa. Kaikki koneen vapaa muisti on käytettävissä. Ei myöskään siirtoja. Vain peräkkäishaku mahdollista. Järjestys osoitetaan linkeillä. Taulukko Muisti varattava kokonaan ennen kuin käyttö alkaa, jolloin muisti voi loppua kesken tai sitä on varattuna liikaa (tiedon siirto) Myös suorahaku on mahdollista, kun järjestysnumero tiedetään. 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. Ohjelmointi Vaatii vähän harjoittelua. On helppoa. 11

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

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). b a c 13

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

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 15