A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen toteutukseen Määrittelyyn kuuluu tietojen keskinäinen organisointi toimenpiteet, jotka rakenteelle voidaan tehdä Abstraktille tietotyypille käytetään lyhennettä ADT (Abstract Data Type). käsitellään seuraavat ADT:t sekä niiden toteutustapoja lista (list) pino (stack) jono (queue) 27.9.2005 KyAMK - TiRak, syksy 2005 2 ABSTRAKTI TIETOTYYPPI TIETOTYYPPIEN TOTEUTUKSESTA ADT:n toteutus voi käsittää seuraavat osat Liitäntä (interface) Toteutus (implementation) Asiakas (client) 1. Liitäntä (interface) Sisältää tietotyypin määrittelyn siten, että käyttäjä pystyy hyödyntämään sitä tietämättä enempää Javassa rajapinta (tai abstrakti luokka) C++:ssa luokkamäärittely (tiedosto luokka.h) Ideana on kapselointi (encapsulation) Tietorakenteen käyttäjän ei tarvitse tuntea sen toteutustapaa Toteutus voi myöhemmin muuttuakin kunhan vain liitäntä pysyy ennallaan 2. Toteutus, "implementaatio" (implementation) Sisältää varsinaisen ohjelmakoodin rakenteelle suoritettavat toimenpiteet Javassa rajapinnan tai abstraktin luokan implementointi C++:ssa luokan metodit 3. Asiakas (client) Ohjelma, joka käyttää tietorakennetta ei tarvitse tietää toteutusta Sovellus toimii, vaikka tietorakenteen toteutus muuttuisi vähentää korjaustarvetta asiakkaan koodiin Lista, pino ja jono toteutustapa voi olla joko Taulukko Linkitetty lista Taulukon käyttö tuttua ja yksinkertaista Taulukolla on kiinteä koko Voidaan viitata suoraan indeksillä Linkitetty lista Koostuu alkioista (node) Alkiot on linkitetty toisiinsa, kuten esim. alla data data data data 27.9.2005 KyAMK - TiRak, syksy 2005 3 27.9.2005 KyAMK - TiRak, syksy 2005 4
LINKITETTY LISTA Linkitetty lista on ns. dynaaminen tietorakenne Listan alkioiden järjestys määräytyy osoittimien avulla Esimerkki: Alkion toteutus Javalla class Node { Object data; Node next; public Node() { data = null; next = null; Huom: Lista ADT ja linkitetty lista ovat eri asia! Lista ADT voidaan määritellä rekursiivisesti: Lista on tyhjä, tai se on alkio, jota seuraa lista. Lista voidaan esittää alkioiden luettelona: a 1, a 2,, a n Lista ADT:n operaatioita (ei täydellinen) CreateList - luo tyhjän listan IsEmpty - vastaus kysymykseen, onko lista tyhjä InsertNode - lisää solun listaan (annetun solun perään) DeleteNode - poistaa solun listasta FindData - etsii solua, jonka data annettu NextNode - annettua solua seuraava solu PreviousNode - annettua solua edeltävä solu PrintList - tulostaa listan sisällön DeleteList - tuhoaa koko listan 27.9.2005 KyAMK - TiRak, syksy 2005 5 27.9.2005 KyAMK - TiRak, syksy 2005 6 Taulukkototeutus 2-ulotteinen taulukko 1. kentässä data 2. kentässä linkki 249 343 128 992 2 5 1 Ominaisuuksia Muistinvaraus etukäteen suurin mahdollinen määrä? Etuna on, että jokainen alkio voidaan hakea yhtä nopeasti Lisäys on hidasta, ellei lisätä aina loppuun Jos lisätään keskelle joudutaan siirtämään alkioita, aikavaatimus O(n) Poistaminen myös hidasta joudutaan siirtämään alkioita, O(n) Ongelmia tulee jatkossa keskitytään enemmän linkitettyyn listaan Toteutus linkitettynä listana Rakenne data data data data Linkitetyn listan ominaisuuksia Ei tuhlaa muistia varataan jokaiselle uudelle alkiolle erikseen Uuden alkion lisäys on nopea, O(1) Etsintä on hitaampaa kuin taulukolla, O(n) Alkion poisto on hidas, kuten taulukollakin, O(n) Käytännössä listan alkuun kannattaa sijoittaa tyhjä alkio (head) osoittamaan ensimmäiseen varsinaiseen alkioon 27.9.2005 KyAMK - TiRak, syksy 2005 7 27.9.2005 KyAMK - TiRak, syksy 2005 8
Esimerkki public class LinkedList { private Node head; // osoittaa 1. alkioon public LinkedList() { head = new Node(); // Luo head-alkion, joka ei osoita // mihinkään (huom. Noden toteutus) public boolean isempty() { if (head.getnext() == null){ return true; return false; 27.9.2005 KyAMK - TiRak, syksy 2005 9 Luonnin jälkeen lista siis sisältää vain yhden alkion (head) Head-alkion data on merkityksetön (sisältää mitä sattuu) Head-alkion linkki ei aluksi osoita minnekään, vaan sen arvona on null Voidaan käyttää tarkistamaan, onko lista tyhjä (isempty() metodi) 27.9.2005 KyAMK - TiRak, syksy 2005 10 TÄRKEIMMÄT LISTAN OPERAATIOT Lisääminen 1. Luodaan uusi alkio 2. Asetetaan siitä linkki seuraavaan alkio 3. Käännetään linkki edellisestä alkiosta uuteen alkioon data 2. data 1. 3. X data TÄRKEIMMÄT LISTAN OPERAATIOT Poistaminen 1. Etsitään poistettavaa alkiota edeltävä alkio 2. Asetetaan siitä linkki poistettavaa seuraavaan alkioon 3. Poistetaan alkio 1. X data data data 3. 2. 27.9.2005 KyAMK - TiRak, syksy 2005 11 27.9.2005 KyAMK - TiRak, syksy 2005 12
TÄRKEIMMÄT LISTAN OPERAATIOT LISTOJEN KÄYTÖSTÄ Läpikäynti (traverse-list) Käydään läpi listan jokainen alkio ja tehdään siinä yhteydessä jotakin Ei yksinään tee siis mitään, vaan liittyy aina johonkin toimintaan Alkoiden määrän laskeminen, listan lopun etsiminen, Tärkeä järjestämisalgoritmeissa public void traverselist() { Node p = this.gethead(); while (p.getnext()!= null) { p = p.getnext(); dosomething(); Listoja käytetään, kun dynaamisesta rakenteesta on huomattavaa hyötyä Uutta tietoa syntyy ja vanhaa poistuu Muistin määrä on rajoitettu (sulautetut järjestelmät) Muita listarakenteita Kahteen suuntaan linkitetty lista data data data data Rengaslista data data data data 27.9.2005 KyAMK - TiRak, syksy 2005 13 27.9.2005 KyAMK - TiRak, syksy 2005 14 PINO ADT (STACK) JA SEN TOTEUTUS PINO ADT (STACK) JA SEN TOTEUTUS Pino on rakenteeltaan kuten lista, mutta eroaa toiminnaltaan merkittävästi Pino toimii ns. LIFO periaatteella (Last In, First Out) eli Pinoon voidaan tallettaa vain "päälle Pinosta voidaan poistaa vain päältä Tyypillisiä pinon toimenpiteitä ovat Push - Tallennus pinoon päällimmäiseksi (Insert) Top - Päällimmäisen alkion haku poistamatta sitä (Find) Pop - Päällimmäisen alkion haku poistamalla (Delete) Pino on toiminnoiltaan rajoitettu lista Voidaan toteuttaa sekä taulukkona että linkitettynä listana Toimenpiderajoitukset on otettava huomioon Toteutuksena katsotaan linkitettyä listaa Lista koostuu samantyyppisistä alkioista kuin edelläkin Head alkion käyttö jälleen hyödyllistä 27.9.2005 KyAMK - TiRak, syksy 2005 15 27.9.2005 KyAMK - TiRak, syksy 2005 16
PINON KÄYTTÖSOVELLUKSIA Symbolien balanssin tarkastus: Tarkastellaan matemaattisessa lausekkeessa esiintyviä sulkumerkkejä () [] { Merkkejä voi olla peräkkäin ja sisäkkäin "kielioppi" oikein, jos samantyyppiset vasen ja oikea sulku esiintyvät pareittain Lauseke 1: { [ ( ) [ ( ) ] ( ) ] ( ) Oikein Lauseke 2: [ ( ) { ( ) { ( ) ] ( ) ] Väärin PINON KÄYTTÖSOVELLUKSIA Tarkastusalgoritmi: Luetaan lauseketta merkki kerrallaan Jos merkki on vasen sulku, talletetaan se pinoon Jos merkki on oikea sulku, luetaan yksi merkki pinosta - jos luettu on samaa tyyppiä oleva vasen sulku, ok Lauseke on virheellinen jos: pinosta tulee vääräntyyppinen vasen sulku pino on tyhjä sieltä luettaessa luettavien merkkien loppuessa pino ei ole tyhjä 27.9.2005 KyAMK - TiRak, syksy 2005 17 27.9.2005 KyAMK - TiRak, syksy 2005 18 PINON KÄYTTÖSOVELLUKSIA Funktion kutsu: Ohjelmointikielissä funktion kutsu toteutetaan lähes aina pinon avulla Tallennettavaa tietoa ovat parametrit paluuosoite Esim. C-kielisen kutsun f( a, b, c ) suorituksen jälkeen pinon 4 päällimmäistä alkiota ovat: c, b, a, paluuosoite. JONO ADT (QUEUE) Jono on myös rakenteeltaan listan kaltainen Ero: jono toimii FIFO periaatteella (First In, First Out) Jonoon voidaan tallentaa vain loppuun Jonosta voidaan poistaa vain alusta Tyypillisiä jonon toimenpiteitä ovat Enqueue First Dequeue - Tallennus jonoon viimeiseksi (Insert) - Ensimmäisen alkion haku poistamatta sitä (Find) - Ensimmmäisen alkion haku poistamalla se (Delete) 27.9.2005 KyAMK - TiRak, syksy 2005 19 27.9.2005 KyAMK - TiRak, syksy 2005 20
JONO ADT (QUEUE) PAKKA ADT (DEQUE) Jono on toiminnoiltaan rajoitettu lista voidaan myös toteuttaa taulukkona tai linkitettynä listana Jonolla on lukuisia käyttökohteita Matematiikassa sillä on oma tutkimusalueensa, jonoteoria Teknillisiä käytännön esimerkkejä prosessien suoritusjono moniajoympäristössä tulostusjono jono palvelimen levylle verkkoympäristössä puhelujono puhelinkeskuksessa Jono on keskeinen tietorakenne myös tietokonesimuloinneissa Pakka on pinon ja jonon yhdistelmä Pakkaa voidaan käsitellä sekä pinoettä jono-operaatioilla Pakkaan voidaan siis tallentaa sekä alkuun tai loppuun Pakasta voidaan hakea sekä alusta tai lopusta 27.9.2005 KyAMK - TiRak, syksy 2005 21 27.9.2005 KyAMK - TiRak, syksy 2005 22 SEURAAVALLA KERRALLA Puurakenteet Mikä on puutietorakenne? Binääripuu 27.9.2005 KyAMK - TiRak, syksy 2005 23