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, Last-In-First-Out, LIFO Perusoperaatiot: push: Alkion lisäys pinon päällimmäiseksi pop: Alkion palautus ja poisto pinon päältä Muita mahdollisia operaatioita: isempty: Testaa onko pino tyhjä size: Palauttaa pinon alkioiden lukumäärän top: Palauttaa pinon päällimmäisen alkion ilman että se poistetaan pinosta Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 3/29
Pinon toteutus Useissa ohjelmointikielissä valmis pinotallennusrakenne Suhteellisen helppo toteuttaa itse: Taulukko Dynaaminen muisti (linkitetty lista) Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 4/29
Pinon toteutus taulukolla 0 1 2... n-1... PMAX-1 x x x x x Taulukko p, jonka koko PMAX Pinon alkioiden lukumäärä n Pinon päällimmäinen alkio p[n-1] Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 5/29
Pinon toteutus taulukolla push: pop: Varmistetaan, että n < PMAX p[n] = alkio n = n+1 Varmistetaan, että n > 0 n = n-1 alkio = p[n] Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 6/29
Pinon toteutus taulukolla + Yksinkertainen Pinon maksimikoko tiedettävä etukäteen Joko varataan tilaa reilusti Tai taulukon täytyttyä kopioidaan isompaan taulukkoon Kaksi pinoa voidaan tallentaa samaan taulukkoon: Pinot alusta loppuun ja lopusta alkuun Vapaa tila taulukon keskellä Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 7/29
Pinon toteutus dynaamisesti Linkitettynä listana: x x x x Linkitys pinon huipulta kohti pohjaa Osoitin pinon päällimmäiseen alkioon Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 8/29
Pinon toteutus Molemmat toteutustavat tehokkaita Pino-operaatiot aikavaativuudeltaan O(1) Paitsi: Jos kaikki alkiot joudutaan kopioimaan Silloin aikavaativuus on O(n) Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 9/29
Esimerkki Aritmeettiset lausekkeet: Vakioita, muuttujasymboleja Binäärisiä operaattoreita +, -, *, / Infix-merkintätapa: Operaattori operandien välissä (a + b)*c + d Tarvitaan säännöt laskujärjestykselle Tarvitaan sulkuja Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 10/29
Esimerkki jatkuu Prefix-merkintätapa: Ensin operaattori, sitten operandit + * + a b c d Ei tarvita sulkuja Postfix-merkintätapa: Ensin operandit, sitten operaattori a b + c * d + Ei tarvita sulkuja Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 11/29
Esimerkki jatkuu Postfix-merkintätavalla esitetyn aritmeettisen lausekkeen arvon laskeminen Operaatiota suoritettaessa tarvitaan kaksi edeltävää operandia Pino sopii hyvin Oletetaan, että lauseke on oikeaa muotoa Käsiteltävä alkio operandi Laitetaan se pinoon Käsiteltävä alkio operaattori Poistetaan pinosta kaksi päällimmäistä alkiota, suoritetaan operaatio, laitetaan tulos pinoon Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 12/29
Esimerkki jatkuu alustetaan pino tyhjäksi while (alkioita lausekkeessa jäljellä) { alkio = seuraava alkio lausekkeesta if (alkio on operandi) push(pino, alkio) else { // alkio on operaattori b = pop(pino) a = pop(pino) push(pino, a alkio b) // tulos pinoon } } tulosta pop(pino) // lopputulos pinon päältä Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 13/29
Esimerkki jatkuu Lausekkeessa n alkiota Lauseke käydään läpi alkio kerrallaan Pinon operaatiot vakioaikaisia Jokaisen alkion kohdalla suoritetaan vakiomäärä vakioaikaisia toimenpiteitä Aikavaativuus O(n) Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 14/29
Jono Jono, queue, First-In-First-Out, FIFO Perusoperaatiot: enqueue: Alkion lisäys viimeiseksi dequeue: Alkion palautus ja poisto alusta Muita mahdollisia operaatioita: isempty: Testaa onko jono tyhjä size: Palauttaa jonon alkioiden lukumäärän front: Palauttaa jonon ensimmäisen alkion ilman että se poistetaan jonosta Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 15/29
Esimerkki A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 16/29
Jonon käyttökohteita Vuoroaan odottavien tehtävien jono moniajokäyttöjärjestelmissä I/O-komentojen jono käyttöjärjestelmän levypalvelimessa Tapahtumajonot (hiiren ja näppäimistön painallukset) graafisten käyttöliittymien ohjausohjelmistoissa Todellisten jonojen mallintaminen simulointiohjelmistoissa Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 17/29
Jonon toteutus Useissa ohjelmointikielissä valmis jonotallennusrakenne Suhteellisen helppo toteuttaa itse: Taulukko Dynaaminen muisti (linkitetty lista) Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 18/29
Jonon toteutus taulukolla 0 1 2... n-1... QMAX-1 x x x x x Taulukko q, jonka koko QMAX Jonon alkioiden lukumäärä n Jonon ensimmäinen alkio q[0] Jonon viimeinen alkio q[n-1] Mutta: Alkion poisto vaatisi kaikkien alkioiden siirtämistä kohti taulukon alkupäätä Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 19/29
Jonon toteutus taulukolla b f x x x x x Parempi toteutus: Kiertävä taulukko Ensimmäisen alkion indeksi f Viimeistä alkiota seuraavan paikan indeksi b Jonossa enintään QMAX-1 alkiota Kun paikka QMAX-1 täyttynyt, seuraava alkio paikkaan 0 Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 20/29
Jonon toteutus taulukolla Jono tyhjä, kun f = b Jono täysi, kun joko f = 0 ja b = QMAX-1 : f b x x x x x x tai kun f > 0 ja f-b = 1 : b f x x x x x x Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 21/29
Jonon toteutus taulukolla enqueue: Varmistetaan, että jono ei ole täysi q[b] = alkio Jos b < QMAX-1, niin b = b+1, muuten b = 0 dequeue: Varmistetaan, että jono ei ole tyhjä alkio = q[f] Jos f < QMAX-1, niin f = f+1, muuten f = 0 Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 22/29
Jonon toteutus Taulukkona: Jonon maksimikoko tiedettävä etukäteen Dynaamisesti linkitettynä listana: Linkitys jonon ensimmäisestä alkiosta kohti viimeistä alkiota Osoittimet jonon ensimmäiseen ja viimeiseen alkioon Molemmissa toteutustavoissa jono-operaatiot aikavaativuudeltaan O(1) Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 23/29
Lista Lista l koostuu joukosta samantyyppisiä alkioita (tietueita) Tyhjässä listassa ei ole yhtään alkiota Epätyhjässä listassa on ensimmäinen alkio first(l) ja viimeinen alkio last(l) Jos listassa on vain yksi alkio, niin first(l)=last(l) Ensimmäinen ja mahdollisesti viimeinen alkio ovat välittömästi käytettävissä Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 24/29
Lista jatkuu Listan alkiot muodostavat täydellisesti järjestetyn joukon: Jokaisella alkiolla a, paitsi viimeisellä, on välitön seuraaja succ(a) Jokaisella alkiolla a, paitsi ensimmäisellä, on välitön edeltäjä pred(a) Jokaiselle alkiolle voidaan antaa järjestysnumero: Alkion first(l) järjestysnumero 0 (tai 1) Jos alkion a järjestysnumero on i, niin alkiolla succ(a) se on i+1 ja alkiolla pred(a) se on i-1 (jos alkiot olemassa) Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 25/29
Listaoperaatiot Listan kulku eteenpäin: Siirrytään alkiosta a alkioon succ(a) (paitsi jos a viimeinen) Listan kulku taaksepäin: Siirrytään alkiosta a alkioon pred(a) (paitsi jos a ensimmäinen) Alkion lisäys listaan: Lisäys ensimmäiseksi tai viimeiseksi yleensä erikoistapauksena Alkion poisto listasta: Ensimmäisen tai viimeisen poisto yleensä erikoistapauksena Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 26/29
Listaoperaatiot jatkuu Alkion käyttö (saanti, access): Alkion tietoja käytetään tai muutetaan Alkio löytyy kulkemalla listaa eteenpäin tai taaksepäin Alkiota ei poisteta listasta Ensimmäisen ja viimeisen alkion saannit erikoistapauksina Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 27/29
Listaoperaatiot jatkuu Listan läpikäynti etenevästi: Suoritetaan jotkin toimenpiteet alkioille järjestyksessä alusta loppuun Alkion a = first(l) saanti Suoritetaan toimenpiteet alkiolle a Seuraavan alkion succ(a) saanti Suoritetaan toimenpiteet alkiolle a Näin jatketaan kunnes viimeinenkin alkio last(l) käsitelty Listan läpikäynti takenevasti: Vastaavasti, lopusta alkuun Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 28/29
Listaoperaatiot jatkuu Listojen yhdistäminen: Listojen l 1 ja l 2 alkiot viedään listaan l 3 Listojen katenointi: Lista l 2 liitetään listan l 1 perään (erikoistapaus yhdistämisestä) Muita operaatioita: Listan perustaminen ja alustaminen tyhjäksi, listan tyhjennys, muistitilan varaaminen listalle, muistitilan vapauttaminen Huom: Pino ja jono erikoistapauksia listasta Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 29/29